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?"
Inutile de dire ceci.
import inspect
inspect.isfunction(func)
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.
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
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
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__))
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