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
XPath クエリ言語を最大限に使用できるように、オプションのlxml
依存関係を指定してastpath
をインストールすることをお勧めします。そのためには、
pip install astpath[xpath]
あるいは、Python の組み込み XPath サブセットを使用した依存関係のないバージョンは、次の方法でインストールできます。
pip install astpath
astpath
Python 2.7 と 3.x の両方をサポートします。
ast
モジュール ドキュメント。bellybutton
、 astpath
上に構築されたフル機能のリンティング エンジン。