[Python] Assurez-vous que la fonction reçue est une fonction définie par l'utilisateur

Ces conseils peuvent être utilisés lorsque vous créez une bibliothèque en Python et que vous souhaitez vérifier "La fonction donnée est-elle vraiment une fonction implémentée par l'utilisateur?"

Déterminez d'abord s'il s'agit d'une fonction

Inutile de dire ceci.

import inspect
inspect.isfunction(func)

Déterminer s'il s'agit d'une fonction intégrée ou d'une fonction figée

En Python, vous pouvez utiliser les fonctions intégrées écrites en langage C et les fonctions figées intégrées au système de traitement Python sous la forme de code d'octet parmi les bibliothèques standard écrites en Python. Par exemple, «builtins.sorted ()» est une fonction intégrée et «zipimport.zipimporter ()» est une fonction figée.

Comment utiliser sys.modules

Ceci est relativement simple, mais il recherche un objet module avec func défini dans sys.modules. S'il n'a pas l'attribut «file», il s'agit d'une fonction intégrée ou d'une fonction figée. (À l'exception des modules intégrés et des modules figés, Python a toujours une correspondance un à un avec les fichiers.)

modname = func.__module__
mod = sys.modules[modname]
fname = getattr(mod, '__file__', None)
return fname != None

Comment utiliser l'objet code

Il existe les méthodes suivantes comme d'autres méthodes. Je pense que c'est plus concis.

co = getattr(func, '__code__', None)
return co != None

Déterminer s'il s'agit d'une fonction créée par l'utilisateur

Je pense qu'il y a plusieurs façons, mais ici si vous obtenez le chemin du fichier où la fonction est définie et qu'il se trouve sous le chemin du module __main__ (répertoire de travail pour STDIN), alors dans la bibliothèque existante Il est déterminé que le fichier est créé par l'utilisateur. Notez que cette décision peut ne pas fonctionner avec un gestionnaire de paquets (tel que pyflow) qui place le cache de la bibliothèque sous le répertoire de travail. De plus, cela peut ne pas fonctionner si vous faites ʻimport tout en changeant le répertoire de travail en utilisant ʻos.chdir etc. (Je ne sais pas s'il existe un tel programme)

filename = path.abspath(co.co_filename)
return filename.startswith(path.join(get_maindir(), ''))

def get_maindir():
    mm = sys.modules['__main__']
    fname = getattr(mm, '__file__', None)
    if fname == None:
        # STDIN
        return os.getcwd()
    else:
        return path.dirname(path.abspath(mm.__file__))

Tout le code source

import sys
import os
import inspect
from os import path
def is_userfunc_b(func):
    if not inspect.isfunction(func):
        return False
    modname = func.__module__
    mod = sys.modules[modname]
    fname = getattr(mod, '__file__', None)
    if fname == None:
        return false
    fname = path.abspath(fname)
    return fname.startswith(path.join(get_maindir(), ''))
    
def is_userfunc(func):
    if not inspect.isfunction(func):
        return False
    co = getattr(func, '__code__', None)
    if co == None:
        return False
    # Check that the file is placed under main module
    filename = path.abspath(co.co_filename)
    return filename.startswith(path.join(get_maindir(), ''))

def get_maindir():
    mm = sys.modules['__main__']
    fname = getattr(mm, '__file__', None)
    if fname == None:
        # STDIN
        return os.getcwd()
    else:
        return path.dirname(path.abspath(mm.__file__))

Recommended Posts

[Python] Assurez-vous que la fonction reçue est une fonction définie par l'utilisateur
[Python] Faire de la fonction une fonction lambda
[python] [meta] Le type de python est-il un type?
Récupérer l'appelant d'une fonction en Python
Copiez la liste en Python
Faire un décorateur de fonction
[Python] Smasher a essayé de faire du processus de chargement de la vidéo une fonction à l'aide d'un générateur
Vérifiez si la chaîne est un nombre en python
[Pratique] Créez une application Watson avec Python! # 2 [Fonction de traduction]
Faire un point d'arrêt sur la couche c avec python
Qu'est-ce que Dieu? Créez un chatbot simple avec python
Tutoriel "Cython" qui rend Python explosif: Gérer le passage de fonctions côté C ++ par référence.
Que signifie le dernier () dans une fonction en Python?
Créer une fonction en Python
Quelle est la fonction d'activation?
À propos de la fonction enumerate (python)
La liste Python n'est pas une liste
Créer un bookmarklet en Python
Faites une loterie avec Python
Qu'est-ce qu'une fonction de rappel?
Qu'est-ce que la fonction de rappel?
L'image est Namekuji
Associez Python Enum à une fonction pour la rendre appelable
[Python] Simplifiez la fonction de format (Qu'est-ce qu'une chaîne f? Expliquez la différence avec la fonction de format avec un exemple)
Jouez des sons en Python en supposant que le clavier est un clavier de piano
Pour vérifier si la clé spécifiée se trouve dans le compartiment spécifié dans Boto 3
Tutoriel "Cython" pour rendre Python explosif: Lorsqu'une fonction côté C ++ a une surcharge.
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
Faisons une interface graphique avec python.
[Python] Qu'est-ce que @? (À propos des décorateurs)
[Python] Temps d'exécution lorsqu'une fonction est saisie dans une valeur de dictionnaire
Supprimer un caractère spécifique en Python s'il s'agit du dernier
Comment créer une fonction récursive
[python] Quelle est la clé triée?
python / Créer un dict à partir d'une liste.
Une fonction qui mesure le temps de traitement d'une méthode en python
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
J'ai créé une fonction pour vérifier si le webhook est reçu dans Lambda pour le moment
À quoi sert le trait de soulignement Python (_)?
Faisons un graphe avec python! !!
[Python] Une fonction simple pour trouver les coordonnées du centre d'un cercle
Enfin ... Créez un contrôleur radio en utilisant python sur Raspberry Pi 3! (Le moteur se déplace lorsque le bouton est enfoncé)
[Python] Qu'est-ce qu'un argument formel? Comment définir la valeur initiale
Quel est le fichier XX à la racine d'un projet Python populaire?
[Introduction à Python] Quelle est la différence entre une liste et un taple?
[Python] Explique comment utiliser la fonction range avec un exemple concret
Fonction Eval () qui calcule une chaîne de caractères comme expression en python
Un script shell pour se souvenir à nouveau du shell pipenv
[Introduction à Python] Comment écrire une chaîne de caractères avec la fonction format
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
[Python] Note: Fonction auto-conçue pour trouver la zone de distribution normale
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
Rendre la console Python couverte d'UNKO
Créer un décorateur de fonction Python avec Class
Faisons un jeu de shiritori avec Python
Précautions lors du décapage d'une fonction en python
[Python] Comment rendre une classe itérable