Diese Tipps können verwendet werden, wenn Sie eine Bibliothek in Python erstellen und überprüfen möchten, ob die angegebene Funktion wirklich eine vom Benutzer implementierte Funktion ist.
Unnötig zu sagen.
import inspect
inspect.isfunction(func)
In Python können Sie die in C geschriebenen Funktionen und die in das Python-Verarbeitungssystem integrierten eingefrorenen Funktionen in Form von Bytecode unter den in Python geschriebenen Standardbibliotheken verwenden. Beispielsweise ist "builtins.sorted ()" eine integrierte Funktion und "zipimport.zipimporter ()" eine eingefrorene Funktion.
sys.modules
benutztIch denke, das ist relativ einfach, aber suchen Sie nach dem Modulobjekt mit func
, das in sys.modules
definiert ist. Wenn das Attribut __file__
nicht vorhanden ist, handelt es sich um eine integrierte Funktion oder eine eingefrorene Funktion. (Mit Ausnahme von integrierten Modulen und eingefrorenen Modulen hat Python immer eine Eins-zu-Eins-Korrespondenz mit Dateien.)
modname = func.__module__
mod = sys.modules[modname]
fname = getattr(mod, '__file__', None)
return fname != None
Es gibt die folgenden Methoden wie andere Methoden. Ich denke, das ist prägnanter.
co = getattr(func, '__code__', None)
return co != None
Ich denke, es gibt verschiedene Möglichkeiten, aber hier, wenn Sie den Pfad der Datei erhalten, in der die Funktion definiert ist und die sich unter dem Modulpfad __main__
(Arbeitsverzeichnis für STDIN) befindet, dann in der vorhandenen Bibliothek Es wird festgestellt, dass die Datei vom Benutzer erstellt wird.
Beachten Sie, dass diese Entscheidung möglicherweise nicht mit einem Paketmanager (z. B. "pyflow") funktioniert, der den Bibliothekscache unter das Arbeitsverzeichnis stellt.
Es funktioniert möglicherweise auch nicht, wenn Sie beim Ändern des Arbeitsverzeichnisses mit "os.chdir" usw. "importieren". (Ich weiß nicht, ob es so ein Programm gibt)
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