Ce qui suit fonctionne bien, ce qu'il ne donne pas d'erreur:classes imbriquées dans des fonctions et des attributs de recherche
def foo(arg):
class Nested(object):
x = arg
foo('hello')
Mais ce qui suit renvoie une exception:
def foo(arg):
class Nested(object):
arg = arg # note that names are the same
foo('hello')
Traceback:
Traceback (most recent call last):
File "test.py", line 6, in <module>
foo('hello')
File "test.py", line 3, in foo
class Nested(object):
File "test.py", line 4, in Nested
arg = arg
NameError: name 'arg' is not defined
Je ne peux pas comprendre la raison d'un tel comportement. Quelqu'un pourrait-il expliquer?
+1: Cela fonctionne aussi si vous aviez "arg = 12", mais Dans ce cas, la variable arg transmise et la variable arg appartenant à la classe Nested sont 2 variables séparées – Steg
Cela n'explique pas pourquoi x = arg fonctionne alors, il devrait échouer pour la même raison, mais ce n'est pas le cas. La vraie raison est, comme l'a souligné Daniel, que Python assume son local parce qu'il lui est assigné. –
Essayez d'insérer 'x = arg' juste avant 'arg = arg' et vous obtiendrez la même erreur sur cette nouvelle ligne. A ce moment, l'argument de foo n'est pas encore occulté. N'est-ce pas? – nkrkv