In Python, warum nicht ein import in ein exec in einer Funktion arbeiten?
Kann ich eine import-Anweisung in einem string, exec, und es funktioniert (druckt einen random digit):
code = """
import random
def f():
print random.randint(0,9)
"""
def f():
pass
exec code
f()
Nun, wenn ich exec code
und f()
in Ihre eigene Funktion und nennen Sie es, es funktioniert nicht.
def test():
exec code
f()
test()
Er sagt NameError: global name 'random' is not defined
.
Keine Ahnung, was Los ist???
Dank
- Neugierig, warum würden Sie wollen, dies zu tun?
- Dies ist Zeichen für schlechtes design - vermeiden.
- +Vincent Savard, arbeite ich mit einem Java-basiertes Produkt, mit dem mich schreiben Python-Skripte in es, und kann ich konfigurieren mein Skript ausgeführt werden, wenn bestimmte vordefinierte Ereignisse eintreten. Allerdings kann ich verwenden der standard-import-Anweisung zum laden einer anderen eines meiner scripts, wenn ich es will, seine Funktionen zu verwenden, wie eine Bibliothek. Stattdessen muss ich laden den code des anderen script aus der Datenbank und exec() werden. Und das problem kommt dadurch, dass Sie anderen Skript importiert Java-Bibliotheken, die ich nicht, in dem Fall den Aufruf einer library-Funktion bewirkt, dass das beschriebene problem durch +Alex Varga
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie wäre es damit:
Was hier Los ist, dass das Modul random importiert wird als lokale variable im test. Versuchen Sie, diese
drucken
Den Grund
f
nicht sehen könnenrandom
ist, dassf
ist nicht eine verschachtelte Funktion innerhalb dertest
--wenn Sie dies getan haben:es funktionieren würde. Jedoch, verschachtelte Funktionen erfordern, dass die äußere Funktion enthält die definition der inneren Funktion, wenn die äußere Funktion kompiliert wird--das ist, weil müssen Sie zum einrichten der Zelle, die Variablen zu halten, Variablen, die gemeinsam zwischen den beiden (äußeren und inneren) Funktionen.
Bekommen zufällig in den globalen namespace, Sie würde nur so etwas tun
Die Argumente von exec nach der
in
Stichwort sind die globalen und lokalen Namespace, in dem der code ausgeführt wird (und damit, wo der name definiert wird in der exec würde-code) gespeichert.Angeben, dass Sie wollen, dass der global
random
ModulDas problem hier ist, dass Sie importieren die
random
Modul in Ihrem Funktionsumfang nicht dem globalen Gültigkeitsbereich.