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)
多亏了eryksun的评论,我进入了sys.\u getframe()的“属性树”,
显然,所有的全局名称,按照代码的出现顺序,都存在于:
它还包括未定义的变量,但是将此信息与globals()连接起来就可以了。你知道吗
您可以使用tokenize.generate_tokens收集有关令牌名称出现顺序的数据。你知道吗
例如,如果将此文件另存为
/tmp/test.py
并运行python /tmp/test.py
,它将读取自己的代码并报告全局变量的显示顺序:收益率
相关问题 更多 >
编程相关推荐