0

一部のグローバルはPythonモジュールで使用されます。

ImFirst = 1  
ImSecond = 2  
AndImThird = "three"  

globals()はそれらの名前と値の辞書を提供しますが、残念ながらそれはOrderedDictではありません(明らかに、globals()はコレクションモジュールよりも前のものであるため)。

モジュールにグローバル名が表示される順序を取得する方法はありますか?

4

2 に答える 2

5

tokenize.generate_tokensを使用して、トークン名が表示される順序でデータを収集できます。

たとえば、このファイルをとして保存し/tmp/test.pyて実行する python /tmp/test.pyと、独自のコードが読み取られ、グローバルが表示される順序が報告されます。

import tokenize
import io
import token
import collections
import itertools

class Token(collections.namedtuple('Token', 'toknum tokval start end line')):
    @property
    def tokname(self):
        return token.tok_name[self.toknum]

ImFirst = 1  
ImSecond = 2  
AndImThird = "three"
if ImSecond:
    ImFourth = 4.0

seen = set()
order = []
with open('/tmp/test.py', 'r') as f:
    for tok in itertools.starmap(Token, tokenize.generate_tokens(f.readline)):
        if tok.tokname == 'NAME' and tok.tokval not in seen:
            seen.add(tok.tokval)
            order.append(tok.tokval)

order = [name for name in order if name in globals()]
print(order)

収量

['tokenize', 'io', 'token', 'collections', 'itertools', 'Token', 'ImFirst', 'ImSecond', 'AndImThird', 'ImFourth', 'seen', 'order', 'f', 'tok', 'name']
于 2012-10-24T10:47:22.410 に答える
0

上記のeryksunのコメントのおかげで、sys._getframe()の「属性ツリー」に飛び込みました
。コードに表示される順序で、すべてのグローバル名は次の場所に存在するようです。

sys._getframe().f_code.co_names

未定義の変数も含まれていますが、この情報をglobals()と結合するとうまくいきます。

于 2012-10-24T20:34:49.900 に答える