ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

在python源代码/脚本中查找依赖项

2019-06-29 20:45:02  阅读:253  来源: 互联网

标签:python dependencies abstract-syntax-tree


我在Python中有一堆简单的脚本,带有简单的表达式[1],如:

C = A+B
D = C * 4

我需要执行它们,但最重要的是我需要知道我依赖的对象是什么;在前一种情况下,对象A和B是外部依赖关系.例如.鉴于我有一个名为source的var中的前代码,我希望能够:

deps = { "A" : 1 , "B": 2}
exec source in deps

因此,必须知道如何建立dict deps.

我潜伏在ast Python模块中,但我不知道.

[1]简单的数学聚合,在一定程度上为周期,仅此而已.

解决方法:

您可以使用标准库中的tokenize模块来标记Python源代码.这将允许您查找脚本中使用的所有变量名称.

现在假设我们将“非依赖”定义为紧跟在=符号之前的任何变量名称.然后,根据脚本代码的简单程度(参见下面的注意事项),您可以通过这种方式确定非依赖项的变量名称:

import tokenize
import io
import token
import collections
import keyword

kwset = set(keyword.kwlist)
class Token(collections.namedtuple('Token', 'num val start end line')):
    @property
    def name(self):
        return token.tok_name[self.num]

source = '''
C = A+B
D = C * 4
'''

lastname = None
names = set()
not_dep = set()
for tok in tokenize.generate_tokens(io.BytesIO(source).readline):
    tok = Token(*tok)
    print(tok.name, tok.val)
    if tok.name == 'NAME':
        names.add(tok.val)
        lastname = tok.val
    if tok.name == 'OP' and tok.val == '=':
        not_dep.add(lastname)

print(names)
# set(['A', 'C', 'B', 'D'])
print(not_dep)
# set(['C', 'D'])

deps = dict.fromkeys(names - not_dep - kwset, 1)
print(deps)
# {'A': 1, 'B': 1}

注意事项:

>如果您的脚本包含除简单之外的语句
分配,然后名称可能会填充不需要的
变量名.例如,

import numpy

会在设置名称中添加’import’和’numpy’.
>如果您的脚本包含使用左手的分配
侧元组拆包,如

E, F = 1, 2

那么上面的天真代码只会识别出F不是a
依赖.

标签:python,dependencies,abstract-syntax-tree
来源: https://codeday.me/bug/20190629/1329637.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有