在python中有没有方法检测模块globals()的顺序?

2024-10-03 06:29:01 发布

您现在位置:Python中文网/ 问答频道 /正文

python模块中使用了一些全局变量:

ImFirst = 1  
ImSecond = 2  
AndImThird = "three"  

globals()给出了这些名称和值的dict,但不幸的是它不是OrderedDict(显然,因为globals()早于collections模块)。你知道吗

有没有办法获得全局名称在模块中出现的顺序?你知道吗


Tags: 模块名称顺序全局collectionsdictordereddictthree
2条回答

多亏了eryksun的评论,我进入了sys.\u getframe()的“属性树”,
显然,所有的全局名称,按照代码的出现顺序,都存在于:

sys._getframe().f_code.co_names

它还包括未定义的变量,但是将此信息与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']

相关问题 更多 >