Undefinierter globaler Ausdruck im Listengenerator mit python3, funktioniert mit python2, welche Änderungen sind erforderlich?

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

Dies funktioniert gut mit Python2.7. Python3 sagt jedoch:

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

Obwohl ich das Problem umgehen kann, würde ich wirklich gerne wissen, worin der Unterschied zwischen Python2 und Python3 besteht. Ich habe Python 2-> 3-Änderungsdokumente gelesen, konnte jedoch keine Beschreibung identifizieren, die mit meinem Problem zusammenhängt. Ebenfalls2to3 Tool beklagt nichts in meinem Code.

Übrigens, ich kann mich zwar nicht an die Situation erinnern, aber ich hatte etwas Ähnliches mit python2nur Auch (ich habe es noch nicht einmal mit 3 ausprobiert), ich dachte, das sollte funktionieren (innerhalb einer Klasse):

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

Es bewirkt jedoch, dass python2 sagt:NameError: name 'self' is not defined Ich habe das mit python3 noch nicht ausprobiert, aber zum Beispiel funktioniert das:

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

Wenn ich den relevanten Teil des vorherigen Beispiels in dieses ändere (ok, das Beispiel selbst ist ein bisschen dumm, aber es zeigt zumindest mein Problem). Jetzt bin ich sehr gespannt, warumself scheint für dieses erste Beispiel nicht definiert zu sein, ist es aber für das zweite? Es scheint, dass ich bei Dikten ein ähnliches Problem habe, um das es in meiner ursprünglichen Frage geht, aber mit Listengenerator-Ausdrücken funktioniert es, aber nicht in Python3. Hmmm ...

Nach meinem Python2 -> 3-Problem habe ich dies erwähnt, da sich all dies anscheinend auf das Problem bezieht, dass laut Python-Interpreter etwas nicht definiert ist (und der zweite Teil meiner Frage möglicherweise nicht damit zusammenhängt?). Ich fühle mich jetzt ziemlich verwirrt. Bitte klären Sie mich über meinen Fehler auf (da ich mir sicher bin, dass ich etwas verpasst habe).

Antworten auf die Frage(1)

Ihre Antwort auf die Frage