So rufen Sie eine Funktion in Python dynamisch aus einer Zeichenfolge auf
Es gab einige Erklärungen zu dynamischen Aufrufen von Methoden und Eigenschaften. Ich wusste nicht, wie man globale Funktionen und Variablen dynamisch aufruft, also habe ich nachgeschlagen.
eval() Wenn Sie eval () ausführen, wird die als Argument übergebene Zeichenfolge als Python-Code ausgewertet. Sie können damit jede Funktion oder jeden Variablenwert aus einer Zeichenfolge aufrufen.
Offizielle Dokumentation http://docs.python.jp/3.5/library/functions.html#eval
Ich benutze es so
eval_test.py
def func():
print('func() is called')
global_val = 'this is global'
#Normale globale Funktion, variabler Aufruf
func()
print(global_val)
#Globale Funktion, variabler Aufruf von Zeichenkette
eval('func')()
print(eval('global_val'))
Ausführungsergebnis
$ python eval_test.py
func() is called
this is global
func() is called
this is global
Damit können Sie alles machen
globals()
Sie können das im globalen Bereich definierte Wörterbuch der Funktionen und Variablen abrufen, indem Sie die integrierte Funktion globals () aufrufen.
Offizielle Dokumentation http://docs.python.jp/3.5/library/functions.html#globals
Ich benutze es so
function_call_test.py
def func():
print('func() is called')
#Globals im lokalen Bereich()
print(globals())
global_val = 'this is global'
#Globale im globalen Geltungsbereich()
print(globals())
#Normale globale Funktion, variabler Aufruf
func()
print(global_val)
#Globale Funktion, variabler Aufruf von Zeichenkette
globals()['func']()
print(globals()['global_val'])
Ausführungsergebnis
$ python function_call_test.py
{'global_val': 'this is global', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10b185828>, '__name__': '__main__', '__package__': None, '__doc__': None, '__cached__': None, '__builtins__': <module 'builtins' (built-in)>, '__spec__': None, 'func': <function func at 0x10b186950>, '__file__': 'function_call_test.py'}
func() is called
{'global_val': 'this is global', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10b185828>, '__name__': '__main__', '__package__': None, '__doc__': None, '__cached__': None, '__builtins__': <module 'builtins' (built-in)>, '__spec__': None, 'func': <function func at 0x10b186950>, '__file__': 'function_call_test.py'}
this is global
func() is called
{'global_val': 'this is global', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10b185828>, '__name__': '__main__', '__package__': None, '__doc__': None, 'func_name': 'func', '__cached__': None, '__builtins__': <module 'builtins' (built-in)>, '__spec__': None, 'func': <function func at 0x10b186950>, '__file__': 'function_call_test.py'}
this is global
Sie können sowohl globale Funktionen als auch globale Variablen als Zeichenfolgen aufrufen. Sie können auch sehen, dass das Ergebnis von globals () das gleiche ist, unabhängig davon, ob Sie es aus dem globalen oder dem lokalen Bereich aufrufen.
locals()
Im Gegensatz zu globals () kann local () das Wörterbuch mit Funktionen und Variablen abrufen, die im lokalen Bereich definiert sind.
Offizielle Dokumentation http://docs.python.jp/3.5/library/functions.html#locals
local_function_call_test.py
def func():
def local_func():
print('local_func() is called')
print('func() is called')
local_val = 'this is local'
#Einheimische im lokalen Bereich()
print(locals())
#Normale lokale Funktion, variabler Aufruf
local_func()
print(local_val)
#Globale Funktion, variabler Aufruf von Zeichenkette
locals()['local_func']()
print(locals()['local_val'])
#Einheimische im globalen Geltungsbereich()
print(locals())
func()
Ausführungsergebnis
$ python local_function_call_test.py
{'__name__': '__main__', '__spec__': None, '__cached__': None, '__doc__': None, '__builtins__': <module 'builtins' (built-in)>, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x1034bc208>, '__package__': None, 'func': <function func at 0x1034b2950>, '__file__': 'local_function_call_test.py'}
func() is called
{'local_val': 'this is local', 'local_func': <function func.<locals>.local_func at 0x10356c620>}
local_func() is called
this is local
local_func() is called
this is local
Sowohl lokale Funktionen als auch lokale Variablen können als Zeichenfolgen aufgerufen werden. Im Gegensatz zu globals () können Sie jedoch feststellen, dass sich der Inhalt von local () je nach aufgerufenem Block ändert.
Es ist im folgenden Artikel zusammengefasst
・ Reflexion in Python http://qiita.com/icoxfog417/items/bf04966d4e9706eb9e04
・ Einführung in die schwarze Magie mit Python http://www.slideshare.net/ssuser38b704/ll-lang-blackmagic
Es scheint, dass es verwendet werden kann, um die Funktionen und Variablen zu überprüfen, die in diesem Bereich aktiviert sind. Soweit ich aus der Dokumentation ersehen kann, scheint globals () statisch bestimmt zu sein
Erstens weiß ich nicht, ob es notwendig sein wird, es sei denn, Sie erstellen ein Framework usw. Metaprogrammierung ist eine Warnung vor Missbrauch, da sie das Verständnis erschwert
Recommended Posts