Неопределенный глобальный в выражении генератора списков с использованием python3, работает с python2, какие изменения необходимы?

class Some(object):
    tokens = [ ... list of strings ... ]
    untokenized = [tokens.index(a) for a in [... some other list of strings ...]]
    ... etc ...
some = Some()

Это прекрасно работает с Python2.7. Однако python3 говорит:

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

Хотя я могу обойти эту проблему, я действительно хотел бы знать, в чем здесь разница между Python2 и Python3. Я прочитал документы об изменениях Python 2-> 3, но мне не удалось найти какое-либо описание, связанное с моей проблемой. Также2to3 Инструмент не жалуется на что-либо в моем коде.

Кстати, сейчас я не могу вспомнить ситуацию, но у меня было что-то похожее с python2only тоже (я даже не пробовал это с 3), я думал, что это должно работать (в классе):

def some_method(self):
    return {a: eval("self." + a) for a in dir(self) if not a.startswith("_")}

Однако это вызывает выражение python2:NameError: name 'self' is not defined Я еще не пробовал это с python3, но, например, это работает:

[eval("self." + a) for a in dir(self) if not a.startswith("_")]

Если я изменю соответствующую часть предыдущего примера на этот (хорошо, сам пример немного глуп, но, по крайней мере, показывает мою проблему). Теперь мне очень любопытно, почемуself Кажется, не определено для этого первого примера, но это для второго? Кажется, с dicts, у меня есть похожая проблема, о которой мой первоначальный вопрос, но с выражением генератора списка это работает, но не в python3. Хммм ...

После моего python2 - & gt; 3 проблема, о которой я упомянул, поскольку все это, похоже, связано с проблемой того, что что-то не определено в соответствии с интерпретатором python (и, возможно, вторая часть моего вопроса не связана?). Я чувствую себя довольно смущенным сейчас. Пожалуйста, расскажите мне о моей ошибке (я уверен, что что-то упустил, конечно).

Ответы на вопрос(1)

Ваш ответ на вопрос