2012-07-23 6 views

Répondre

4

Le meilleur moyen d'y parvenir est le module ast. En particulier, ast.get_docstring fait presque ce que vous voulez; elle renvoie le contenu du docstring plutôt que le nœud, mais vous pouvez utiliser le même algorithme pour trouver le noeud docstring et son emplacement:

root = ast.parse(''' 
def foo(): 
    """the foo function""" 
    pass 
''') 
for node in ast.walk(root): 
    if isinstance(node, (ast.FunctionDef, ast.ClassDef, ast.Module)): 
     if (node.body and isinstance(node.body[0], ast.Expr) and 
      isinstance(node.body[0].value, ast.Str)): 
      print node.lineno, node.body[0].value.lineno, node.body[0].value.s 

Bien que non documentée, la propriété lineno donne la dernière ligne d'un noeud , donc le lineno du nœud parent sera la première ligne de la docstring ou la ligne avant elle. Il ne semble pas y avoir un moyen facile de faire la différence entre un docstring commençant sur la même ligne que le mot-clé class ou def et sur la ligne suivante, en particulier si vous considérez les caractères de continuation de ligne (\).

+0

Merci beaucoup! Cela semble faire ce que je veux. – Hypercube

+0

Savez-vous s'il existe une façon cohérente d'obtenir le numéro de ligne d'un nœud? Fondamentalement, je veux savoir s'il y a quelque chose d'autre sur la même ligne qu'un docstring, parce que cela peut arriver: 'def test(): '' 'Ceci est une docstring' ''; pass' – Hypercube

+1

@Hypercube tous les nœuds ont une propriété 'lineno', donc dans ce cas l'instruction pass aura le même' lineno' que la docstring. – ecatmur

Questions connexes