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
、ツールは私のコードで何も文句を言いません。
ちなみに、今は状況を思い出せませんが、python2だけでも似たようなことがありました(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
この最初の例では定義されていないようですが、2番目の例では定義されているのですか? 辞書のようですが、元の質問と同様の問題がありますが、リストジェネレータ式では機能しますが、python3では機能しません。うーん...
私の python2 -> 3 問題の後、私はこれについて言及しました。これらはすべて、Python インタープリターに従って何かが定義されていないという問題に関するものであるように思われるからです (そして、私の質問の 2 番目の部分は無関係ではないでしょうか?)。私は今かなり混乱しています。私の間違いについて教えてください(もちろん、何かを逃したと確信しているので)。