Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python从python代码中删除所有字符串和注释_Python_Abstract Syntax Tree - Fatal编程技术网

使用python从python代码中删除所有字符串和注释

使用python从python代码中删除所有字符串和注释,python,abstract-syntax-tree,Python,Abstract Syntax Tree,我想计算一下我编写的所有python代码中变量名的唯一性。为此,我需要去掉所有关键字和保留字(已知)、注释和字符串。例如,以下代码: ''' long comment ''' for x in range(y, y+foo): print "Hello", 'world', '''lookout for the # tricky nest''', q # comment 应该被剥离为for、x、in、range、y、foo、print、q的标记,可以使用一组已知的关键字进一步解析这些标

我想计算一下我编写的所有python代码中变量名的唯一性。为此,我需要去掉所有关键字和保留字(已知)、注释和字符串。例如,以下代码:

''' long comment '''
for x in range(y, y+foo):
    print "Hello", 'world', '''lookout for the # tricky nest''', q # comment

应该被剥离为
for、x、in、range、y、foo、print、q的标记,可以使用一组已知的关键字进一步解析这些标记。这是否可能使用python引擎本身(可能使用)?

如果您更关心获取变量列表,而不是如何去除所有字符串、注释等,您可以尝试以下方法:

for name in (set(locals()) | set(globals())):
    print(name)
打印本地词典或全局词典中显示的任何内容。使用
dir(myobject)
获取
myobject
的变量


这是我第一次使用
ast
模块,但是收集源中引用的所有对象名称相对容易:

import ast

class Visit(ast.NodeVisitor):
    def __init__(self):
        ast.NodeVisitor.__init__(self)
        self.s = set()
    def visit_Name(self,node):
        self.s.add(node.id)

with open('x.py') as f:
    a=ast.parse(f.read())
v = Visit()
v.visit(a)
print v.s
其中
x.py
为:

''' long comment '''
q=7
y=0
foo=10
for x in range(y,y+foo):
    print "Hello", 'world', '''lookout for the # tricky nest''', q # comment
输出:

set(['q', 'y', 'range', 'foo', 'x'])

请注意,关键字还没有包括在内,但它确实提取了函数名
范围

@AvinashRaj现在我有一个过于复杂的pyparsing代码来解释python代码。我意识到这可以在内部用发动机本身来完成。因为我不知道AST模块,而且pyarsing与这里的问题无关,所以我把它省略了。