Niezdefiniowane globalne wyrażenie generatora listy za pomocą python3, działa z python2, jakie zmiany są potrzebne?
class Some(object):
tokens = [ ... list of strings ... ]
untokenized = [tokens.index(a) for a in [... some other list of strings ...]]
... etc ...
some = Some()
Działa to dobrze z Pythonem 2.7. Jednak python3 mówi:
Traceback (most recent call last):
File "./test.py", line 17, in <module>
class Some(object):
File "./test.py", line 42, in Some
untokenized = [tokens.index(a) for a in [... some other list of strings ...]]
File "./test.py", line 42, in <listcomp>
untokenized = [tokens.index(a) for a in [... some other list of strings ...]]
NameError: global name 'tokens' is not defined
Chociaż mogę obejść ten problem, naprawdę chciałbym wiedzieć, jaka jest różnica między Pythonem 2 a Pythonem3. Czytałem python 2-> 3 zmiany dokumentów, ale nie byłem w stanie zidentyfikować żadnego opisu związanego z moim problemem. Również2to3
narzędzie nie narzeka na nic w moim kodzie.
Nawiasem mówiąc, nie mogę teraz przypomnieć sobie sytuacji, ale miałem coś podobnego z python2tylko też (nawet nie próbowałem tego z 3), myślałem, że to powinno działać (w klasie):
def some_method(self):
return {a: eval("self." + a) for a in dir(self) if not a.startswith("_")}
Powoduje jednak, że python2 mówi:NameError: name 'self' is not defined
Nie próbowałem tego jeszcze z python3, ale na przykład to działa:
[eval("self." + a) for a in dir(self) if not a.startswith("_")]
Jeśli zmienię odpowiednią część poprzedniego przykładu na ten (ok, sam przykład jest trochę głupi, ale przynajmniej pokazuje mój problem). Teraz jestem bardzo ciekawa, dlaczegoself
wydaje się nie być zdefiniowany dla tego pierwszego przykładu, ale dla drugiego? Wydaje się, że z dicts, mam podobny problem, który dotyczy mojego pierwotnego pytania, ale z wyrażeniem generatora list działa, ale nie w python3. Hmmm ...
Po moim problemie python2 -> 3 wspomniałem o tym, ponieważ wydaje się, że wszystkie dotyczą problemu polegającego na tym, że coś nie jest zdefiniowane według interpretera python (a może druga część mojego pytania nie jest związana?). Czuję się teraz dość zmieszany. Proszę mnie oświecić o moim błędzie (ponieważ jestem pewien, że oczywiście coś przeoczyłem).