完全を期すために、コードをインポートする代わりに解析したい場合があることを指摘しておきます。Animport
はトップレベルの式を実行しますが、これが問題になる可能性があります。
たとえば、zipappで作成されるパッケージのエントリ ポイント関数をユーザーが選択できるようにしています。誤ったコードを使用import
しinspect
て実行すると、クラッシュ、ヘルプ メッセージの出力、GUI ダイアログのポップアップなどにつながるリスクがあります。
代わりにastモジュールを使用して、トップレベルの関数をすべてリストします。
import ast
import sys
def top_level_functions(body):
return (f for f in body if isinstance(f, ast.FunctionDef))
def parse_ast(filename):
with open(filename, "rt") as file:
return ast.parse(file.read(), filename=filename)
if __name__ == "__main__":
for filename in sys.argv[1:]:
print(filename)
tree = parse_ast(filename)
for func in top_level_functions(tree.body):
print(" %s" % func.name)
このコードlist.py
を入力してそれ自体を入力として使用すると、次のようになります。
$ python list.py list.py
list.py
top_level_functions
parse_ast
もちろん、AST は非常に低レベルであるため、Python のような比較的単純な言語であっても、AST をナビゲートするのは難しい場合があります。しかし、シンプルで明確なユースケースがあれば、それは実行可能で安全です。
ただし、欠点は、実行時に生成される関数 ( など) を検出できないことですfoo = lambda x,y: x*y
。