Pour être complet bien, je voudrais souligner que, parfois, vous pouvez Parse code au lieu de l'importer. Un import
exécutera des expressions de niveau supérieur, ce qui peut poser un problème. Par exemple, je laisse les utilisateurs sélectionner les fonctions de point d'entrée pour les paquets en cours de création avec zipapp. L'utilisation des codes import
et inspect
risque de générer du code égaré, ce qui entraînerait des plantages, des messages d'aide en cours d'impression, des boîtes de dialogue GUI apparaîtraient, etc.
Au lieu de cela utiliser le module ast pour lister toutes les fonctions de haut niveau:
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)
Mettre ce code dans list.py
et s'utilisant comme entrée, je reçois:
$ python list.py list.py
list.py
top_level_functions
parse_ast
Bien sûr, naviguer dans un AST peut parfois être difficile, même pour un langage relativement simple comme Python, parce que l'AST est assez bas niveau. Mais si vous avez un cas d'utilisation simple et clair, c'est à la fois faisable et sûr. Cependant, un inconvénient est que vous ne pouvez pas détecter les fonctions qui sont générées au moment de l'exécution, comme foo = lambda x,y: x*y
.
S'il vous plaît envisager d'examiner la réponse sélectionnée! il y a des solutions meilleures/plus faciles à utiliser suggérées dans d'autres réponses. – r2d2oid