2 votes

Comment accéder au code Python de manière programmatique ? Par exemple, obtenir une liste de classes, ses docstrings, etc ?

J'essaie de lire du code python (plus précisément des tests unitaires) sous forme d'objets structurés.

Par exemple.

class ProjectA(unittest.TestCase):

    def testB(self):
        """
        hello world B
        """
        assert False

    def testA(self):
        """
        hello world
        """
        assert False

Je voudrais lire ce fichier de code dans un objet, un dict comme ceci :

{
    'classes': [{'ProjectA': [__init__, testA, testB]}]
}

Pour laquelle je peux lire celle de testA via testA['docstring'].


En gros, j'aimerais récupérer la structure du code python dans un objet que je peux analyser.

Comment s'appellera une telle chose (pour que je puisse me documenter) ?

Gracias.

2voto

bgporter Points 11119

C'est ce que le ast Le module est destiné à -- générer des arbres syntaxiques abstraits du source Python :

>>> import ast
>>> source = '''import unittest
...
...
... class ProjectA(unittest.TestCase):
...
...     def testB(self):
...         """
...         hello world B
...         """
...         assert False
...
...     def testA(self):
...         """
...         hello world
...         """
...         assert False'''
>>> tree = ast.parse(source)
>>> for node in ast.walk(tree):
...    print node
...
<_ast.Module object at 0x103aa5f50>
<_ast.Import object at 0x103b0a810>
<_ast.ClassDef object at 0x103b0a890>
<_ast.alias object at 0x103b0a850>
<_ast.Attribute object at 0x103b0a8d0>
<_ast.FunctionDef object at 0x103b0a950>
<_ast.FunctionDef object at 0x103b0ab10>
<_ast.Name object at 0x103b0a910>
<_ast.Load object at 0x103b02190>
<_ast.arguments object at 0x103b0a990>
<_ast.Expr object at 0x103b0aa10>
<_ast.Assert object at 0x103b0aa90>
<_ast.arguments object at 0x103b0ab50>
<_ast.Expr object at 0x103b0abd0>
<_ast.Assert object at 0x103b0ac50>
<_ast.Load object at 0x103b02190>
<_ast.Name object at 0x103b0a9d0>
<_ast.Str object at 0x103b0aa50>
<_ast.Name object at 0x103b0aad0>
<_ast.Name object at 0x103b0ab90>
<_ast.Str object at 0x103b0ac10>
<_ast.Name object at 0x103b27d50>
<_ast.Param object at 0x103b02410>
<_ast.Load object at 0x103b02190>
<_ast.Param object at 0x103b02410>
<_ast.Load object at 0x103b02190>

0voto

creativeChips Points 837

Vous pouvez explorer la classe en utilisant inspecter

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X