142 votes

Python peut-il imprimer une définition de fonction ?

En JavaScript, on peut imprimer la définition d'une fonction. Existe-t-il un moyen d'accomplir cela en Python ?

(Je jouais juste en mode interactif, et je voulais lire un module sans open(). J'étais juste curieux).

0 votes

Vous avez la source de la fonction. Qu'est-ce qui ne va pas avec ça ?

1 votes

Et en mode interactif, vous pouvez utiliser help(function) pour afficher la docstring de la fonction.

0 votes

Il y a un double de cette question : stackoverflow.com/questions/427453/

187voto

Triptych Points 70247

Si vous importez la fonction, vous pouvez utiliser inspect.getsource :

>>> import re
>>> import inspect
>>> print inspect.getsource(re.compile)
def compile(pattern, flags=0):
    "Compile a regular expression pattern, returning a pattern object."
    return _compile(pattern, flags)

Ce site se fonctionnent dans l'invite interactive, mais apparemment uniquement sur les objets importés (pas sur les objets définis dans l'invite interactive). Et bien sûr, cela ne fonctionnera que si Python peut trouver le code source (donc pas sur les objets intégrés, les librairies C, les fichiers .pyc, etc).

0 votes

Les fonctions qui sont créées au moment de l'exécution (y compris l'invite interactive) n'ont pas non plus de numéro de fichier ou de ligne, ce qui est logique.

0 votes

Cela semble être ce que je recherchais. Merci.

9 votes

Qu'en est-il de l'impression d'une définition de fonction que j'ai définie plus tôt dans l'interpréteur Python interactif actuel ? Est-ce possible ?

114voto

Peter Points 38320

Si vous utilisez iPython vous pouvez utiliser function_name? pour obtenir de l'aide, et function_name?? imprimera la source, si elle le peut.

2 votes

Parfois vous devez séparer la fonction dans une autre ligne pour l'appeler ? par exemple model.function ?? ne fonctionne pas mais f = model.function ; f ?? fonctionne

27voto

Steve Points 501

C'est la façon dont j'ai compris comment faire :

    import inspect as i
    import sys
    sys.stdout.write(i.getsource(MyFunction))

Cela supprime les caractères de la nouvelle ligne et imprime la fonction de manière agréable.

2 votes

Exemple brisé ici, ce devrait être i.getsource(MyFunction).

12voto

Mike McKerns Points 965

Bien que je sois généralement d'accord pour dire que inspect est une bonne réponse, je ne suis pas d'accord pour dire que vous ne pouvez pas obtenir le code source des objets définis dans l'interpréteur. Si vous utilisez dill.source.getsource de dill vous pouvez obtenir la source des fonctions et des lambdas, même si elles sont définies de manière interactive. Il peut également obtenir le code des méthodes et des fonctions de classes liées ou non liées définies dans des curries... cependant, il se peut que vous ne puissiez pas compiler ce code sans le code de l'objet englobant.

>>> from dill.source import getsource
>>> 
>>> def add(x,y):
...   return x+y
... 
>>> squared = lambda x:x**2
>>> 
>>> print getsource(add)
def add(x,y):
  return x+y

>>> print getsource(squared)
squared = lambda x:x**2

>>> 
>>> class Foo(object):
...   def bar(self, x):
...     return x*x+x
... 
>>> f = Foo()
>>> 
>>> print getsource(f.bar)
def bar(self, x):
    return x*x+x

>>>

5voto

Safwan Points 1028

Utilisez help(function) pour obtenir la description de la fonction.

Vous pouvez en savoir plus sur help() aquí .

2 votes

N'avait pas la source définie dans l'aide pour moi.

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