Python - Dynamische Aufruffunktion von String

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.

(Referenz) Dynamischer Aufruf von Klassen, Methoden und Eigenschaften

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

Zusammenfassung

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

Python - Dynamische Aufruffunktion von String
So erstellen Sie ein Funktionsobjekt aus einer Zeichenfolge
So rufen Sie eine Funktion auf
[Python] So rufen Sie eine Funktion von c aus Python auf (ctypes edition)
Erstellen Sie einen Pandas-Datenrahmen aus einer Zeichenfolge.
# 5 [python3] Extrahiert Zeichen aus einer Zeichenfolge
Generieren Sie eine Klasse aus einer Zeichenfolge in Python
Aufrufbefehle von Python (Windows Edition)
Rufen Sie Python-Skripte aus Embedded Python in C ++ / C ++ auf
Erstellen Sie ein Datum / Uhrzeit-Objekt aus einer Zeichenfolge in Python (Python 3.3).
[Go] So schreiben oder rufen Sie eine Funktion auf
dlopen () Verfolgt einen Funktionsaufruf in einer gemeinsam genutzten Bibliothek
[Python] Ich habe versucht, den Typnamen als Zeichenfolge aus der Typfunktion abzurufen
Unterscheiden Sie eine Funktion mit zwei Variablen
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Ein Hinweis zu __call__
Betrachten Sie die Konvertierung von Python rekursiv in nicht rekursiv
Rufen Sie Rust von Python an, um schneller zu werden! PyO3-Tutorial: Umschließen einer einfachen Funktion Teil ➁
Python> Aus einer mehrzeiligen Zeichenfolge anstelle einer Datei lesen> io.StringIO ()
Rufen Sie CPLEX von Python aus auf (DO cplex)
Erstellen Sie eine Funktion in Python
Schreiben Sie eine Kerneldichtefunktion
Ist diese Zeichenfolge ein Bruchteil?
Versuchen Sie, eine logistische Funktion zu zeichnen
Was ist ein Systemaufruf?
Was ist eine Rückruffunktion?
Erstellen Sie eine Instanz einer vordefinierten Klasse aus einer Zeichenfolge in Python
[Road to Intermediate Python] Rufen Sie eine Klasseninstanz wie eine Funktion mit __call__ auf
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
So erhalten Sie eine Zeichenfolge aus einem Befehlszeilenargument in Python
So extrahieren Sie die gewünschte Zeichenfolge aus einem Befehl in Zeile 4
Rufen Sie dlm von Python aus auf, um ein zeitvariables Koeffizientenregressionsmodell auszuführen