Je suis en train d'exécuter un morceau de code python en utilisant exec.
my_code = """
class A(object):
pass
print 'locals: %s' % locals()
print 'A: %s' % A
class B(object):
a_ref = A
"""
global_env = {}
local_env = {}
my_code_AST = compile(my_code, "My Code", "exec")
exec(my_code_AST, global_env, local_env)
print local_env
ce qui entraîne la sortie suivante
locals: {'A': <class 'A'>}
A: <class 'A'>
Traceback (most recent call last):
File "python_test.py", line 16, in <module>
exec(my_code_AST, global_env, local_env)
File "My Code", line 8, in <module>
File "My Code", line 9, in B
NameError: name 'A' is not defined
Cependant, si je change le code de cette -
my_code = """
class A(object):
pass
print 'locals: %s' % locals()
print 'A: %s' % A
class B(A):
pass
"""
global_env = {}
local_env = {}
my_code_AST = compile(my_code, "My Code", "exec")
exec(my_code_AST, global_env, local_env)
print local_env
puis il fonctionne très bien - en donnant la sortie suivante -
locals: {'A': <class 'A'>}
A: <class 'A'>
{'A': <class 'A'>, 'B': <class 'B'>}
Clairement Un est présent et accessible - ce qui ne va pas dans le premier morceau de code? Je suis en utilisant 2.6.5, cheers,
Colin
* Mise à JOUR de 1 *
Si je coche locals() à l'intérieur de la classe -
my_code = """
class A(object):
pass
print 'locals: %s' % locals()
print 'A: %s' % A
class B(object):
print locals()
a_ref = A
"""
global_env = {}
local_env = {}
my_code_AST = compile(my_code, "My Code", "exec")
exec(my_code_AST, global_env, local_env)
print local_env
Puis il devient clair que les gens du pays() n'est pas la même dans les deux lieux -
locals: {'A': <class 'A'>}
A: <class 'A'>
{'__module__': '__builtin__'}
Traceback (most recent call last):
File "python_test.py", line 16, in <module>
exec(my_code_AST, global_env, local_env)
File "My Code", line 8, in <module>
File "My Code", line 10, in B
NameError: name 'A' is not defined
Cependant, si je fais cela, il n'y a pas de problème -
def f():
class A(object):
pass
class B(object):
a_ref = A
f()
print 'Finished OK'
* Mise à JOUR 2 *
ok, donc les docs ici - http://docs.python.org/reference/executionmodel.html
"Une définition de classe est un exécutable énoncé qui peut utiliser et définir des noms. Ces références suivent les règles normales pour la résolution de nom. L'espace de noms de la définition de la classe devient l'attribut dictionnaire de la classe. Les noms définis à l'étendue de classe ne sont pas visibles dans les méthodes.'
Il me semble que " A " doit être mis à la disposition gratuitement de la variable dans le fichier exécutable énoncé de la définition de B, et lorsque cela se produit, nous appelons f() ci-dessus, mais pas quand nous utiliser exec(). Cela peut être plus facilement illustré par la suivante -
my_code = """
class A(object):
pass
print 'locals in body: %s' % locals()
print 'A: %s' % A
def f():
print 'A in f: %s' % A
f()
class B(object):
a_ref = A
"""
les sorties qui
locals in body: {'A': <class 'A'>}
A: <class 'A'>
Traceback (most recent call last):
File "python_test.py", line 20, in <module>
exec(my_code_AST, global_env, local_env)
File "My Code", line 11, in <module>
File "My Code", line 9, in f
NameError: global name 'A' is not defined
Donc je suppose que la nouvelle question est pourquoi ne sont pas les habitants d'être exposées comme des variables libres dans des fonctions et des définitions de classe -, il semble comme une jolie fermeture standard scénario.