astpath
1.0.0
[e ɛs ti pæθ] n 。
Ⅰ.用于使用 XPath 语法查询 Python AST 的命令行实用程序。
ⅠⅠ.搜索代码库的更好方法。
查找eval
内置函数的所有用法:
$ astpath " .//Call/func/Name[@id='eval'] " | head -5
./rlcompleter.py:136 > thisobject = eval(expr, self.namespace)
./warnings.py:176 > cat = eval(category)
./rexec.py:328 > return eval(code, m.__dict__)
./pdb.py:387 > func = eval(arg,
./pdb.py:760 > return eval(arg, self.curframe.f_globals,
查找所有数字:
$ astpath " .//Num " | head -5
./DocXMLRPCServer.py:31 > here = 0
./DocXMLRPCServer.py:41 > while 1:
./DocXMLRPCServer.py:57 > elif text[end:end+1] == ' ( ' :
./DocXMLRPCServer.py:82 > args[1:],
./DocXMLRPCServer.py:96 > argspec = object[0] or argspec
...从未分配给变量:
$ astpath " .//Num[not(ancestor::Assign)] " | head -5
./DocXMLRPCServer.py:41 > while 1:
./DocXMLRPCServer.py:57 > elif text[end:end+1] == ' ( ' :
./DocXMLRPCServer.py:201 > assert 0, " Could not find method in self.functions and no "
./DocXMLRPCServer.py:237 > self.send_response(200)
./DocXMLRPCServer.py:252 > logRequests=1, allow_none=False, encoding=None,
...并且大于 1000:
$ astpath " .//Num[not(ancestor::Assign) and number(@n) > 1000] " | head -5
./decimal.py:959 > return 314159
./fractions.py:206 > def limit_denominator(self, max_denominator=1000000):
./pty.py:138 > return os.read(fd, 1024)
./whichdb.py:94 > if magic in (0x13579ace, 0x13579acd, 0x13579acf):
./whichdb.py:94 > if magic in (0x13579ace, 0x13579acd, 0x13579acf):
查找长度超过 42 个字符的名称:
$ astpath " //Name[string-length(@id) > 42] "
./site-packages/setuptools/dist.py:59 >_patch_distribution_metadata_write_pkg_info ()
./site-packages/setuptools/command/easy_install.py:1759 > updater=clear_and_remove_cached_zip_archive_directory_data)
./test/test_reprlib.py:268 > module = areallylongpackageandmodulenametotestreprtruncation
./test/test_argparse.py:2744 > MEPBase, TestMutuallyExclusiveOptionalsAndPositionalsMixed):
查找引发与捕获的异常类不同的异常类的except
子句:
$ astpath " //ExceptHandler[body//Raise/exc//Name and not(contains(body//Raise/exc//Name/@id, type/Name/@id))] " | head -5
./hashlib.py:144 > except ImportError:
./plistlib.py:89 > except KeyError:
./plistlib.py:103 > except KeyError:
./nntplib.py:868 > except ValueError:
./argparse.py:1116 > except KeyError:
查找无法访问的代码块的开头:
$ astpath " //body/*[preceding-sibling::Return or preceding-sibling::Raise][1] "
./unittest/test/testmock/testhelpers.py:381 > class Foo(object):
./test/test_deque.py:16 > yield 1
./test/test_posix.py:728 > def _create_and_do_getcwd(dirname, current_path_length = 0):
寻找用sum
替换的候选者:
$ astpath -A 1 " //For/body[AugAssign/op/Add and count(child::*)=1] " | head -6
./functools.py:374 > for item in sorted_items:
./functools.py:375 key += item
./statistics.py:177 > for d, n in sorted(partials.items ()):
./statistics.py:178 total += Fraction(n, d)
./pstats.py:512 > for calls in callers.values ():
./pstats.py:513 nc += calls
查找与正则表达式匹配的类:
$ astpath " //ClassDef[re:match('.*Var', @name)] " | head -5
./typing.py:452 > class TypeVar(_TypingBase, _root=True):
./typing.py:1366 > class _ClassVar(_FinalTypingBase, _root=True):
./tkinter/__init__.py:287 > class Variable:
./tkinter/__init__.py:463 > class StringVar(Variable):
./tkinter/__init__.py:485 > class IntVar(Variable):
astpath
也可以通过编程方式导入和使用:
>> > from astpath import search
>> > len ( search ( '.' , '//Print' , print_matches = False )) # number of print statements in the codebase
751
建议使用可选的lxml
依赖项安装astpath
,以允许充分使用 XPath 查询语言。为此,
pip install astpath[xpath]
或者,可以通过以下方式安装使用 Python 内置 XPath 子集的无依赖版本
pip install astpath
astpath
同时支持 Python 2.7 和 3.x。
ast
模块文档。bellybutton
,一个基于astpath
构建的全功能 linting 引擎。