Indefinido global na expressão do gerador de lista usando python3, funciona com python2, quais mudanças são necessárias?
class Some(object):
tokens = [ ... list of strings ... ]
untokenized = [tokens.index(a) for a in [... some other list of strings ...]]
... etc ...
some = Some()
Isso funciona bem com o Python2.7. No entanto python3 diz:
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
Embora eu possa contornar o problema, eu realmente gostaria de saber a diferença entre o Python2 e o Python3. Eu li os documentos do python 2-> 3 changes, mas não consegui identificar nenhuma descrição relacionada ao meu problema. Além disso2to3
ferramenta não reclama nada no meu código.
By the way, embora eu não possa lembrar a situação agora, mas eu tinha algo semelhante com python2só também (eu nem tentei isso com 3), eu pensei que isso deveria funcionar (dentro de uma classe):
def some_method(self):
return {a: eval("self." + a) for a in dir(self) if not a.startswith("_")}
No entanto, faz com que python2 diga:NameError: name 'self' is not defined
Eu não tentei isso com python3 ainda, mas por exemplo, isso funciona:
[eval("self." + a) for a in dir(self) if not a.startswith("_")]
Se eu mudar a parte relevante do exemplo anterior para esta (ok, o exemplo em si é um pouco estúpido, mas mostra o meu problema, pelo menos). Agora estou muito curioso, porqueself
parece não ser definido para este primeiro exemplo, mas é para o segundo? Parece com dicts, eu tenho problema semelhante que minha pergunta original é sobre, mas com a expressão de gerador de lista funciona, mas não em python3. Hmmm ...
Depois do meu problema python2 -> 3 eu mencionei isto, já que todos estes parecem ser sobre o problema que algo não é definido de acordo com o interpretador python (e talvez a segunda parte da minha questão não esteja relacionada?). Eu me sinto muito confuso agora. Por favor, esclarecer-me sobre o meu erro (desde que eu tenho certeza que eu perdi alguma coisa, claro).