python模块中使用了一些全局变量:
ImFirst = 1
ImSecond = 2
AndImThird = "three"
globals()给出了这些名称和值的字典,但不幸的是它不是OrderedDict(显然,因为globals()早于集合模块)。
有没有办法获得全局名称在模块中出现的顺序?
答案 0 :(得分: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']
答案 1 :(得分:0)
感谢上面的eryksun评论,我潜入了sys._getframe()的'属性树',
并且显然所有全局名称,按代码出现的顺序,存在于:
sys._getframe().f_code.co_names
它还包含未定义的变量,但是使用globals()连接此信息可以解决问题。