一部のグローバルはPythonモジュールで使用されます。
ImFirst = 1
ImSecond = 2
AndImThird = "three"
globals()はそれらの名前と値の辞書を提供しますが、残念ながらそれはOrderedDictではありません(明らかに、globals()はコレクションモジュールよりも前のものであるため)。
モジュールにグローバル名が表示される順序を取得する方法はありますか?
一部のグローバルはPythonモジュールで使用されます。
ImFirst = 1
ImSecond = 2
AndImThird = "three"
globals()はそれらの名前と値の辞書を提供しますが、残念ながらそれはOrderedDictではありません(明らかに、globals()はコレクションモジュールよりも前のものであるため)。
モジュールにグローバル名が表示される順序を取得する方法はありますか?
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']
上記のeryksunのコメントのおかげで、sys._getframe()の「属性ツリー」に飛び込みました
。コードに表示される順序で、すべてのグローバル名は次の場所に存在するようです。
sys._getframe().f_code.co_names
未定義の変数も含まれていますが、この情報をglobals()と結合するとうまくいきます。