2010-02-03 5 views
9

Je travaille dans le shell interactif Python (ActiveState ActivePython 2.6.4 sous Windows XP). J'ai créé une fonction qui fait ce que je veux. Cependant, j'ai effacé l'écran, donc je ne peux pas revenir en arrière et regarder la définition de la fonction. Il s'agit également d'une fonction multiligne, donc la flèche vers le haut pour réafficher les lignes est de valeur minimale. Y at-il de toute façon retourner le code de la fonction? Il y a des attributs "code" et "func_code" affichés par dir(), mais je ne sais pas s'ils contiennent ce dont j'ai besoin.Définition de la fonction d'affichage dans le shell interactif

+1

je l'avais suggéré d'utiliser la fonction « aide », mais réalisé que vous voulez que le code réel dans la fonction, non seulement il est la signature. –

+0

Je voudrais obtenir tout le code que j'ai écrit dans la console en tant que fichier, mais pour les réponses que vous avez reçues ce n'est pas possible ... triste –

Répondre

8

Non, __code__ et func_code sont des références au bytecode compilé - vous pouvez les désassembler (voir dis.dis) mais ne pas revenir au code source Python.

Hélas, le code source est tout simplement disparu, ne se souvenait nulle part ...:

>>> import inspect 
>>> def f(): 
... print 'ciao' 
... 
>>> inspect.getsource(f) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/inspect.py", line 694, in getsource 
    lines, lnum = getsourcelines(object) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/inspect.py", line 683, in getsourcelines 
    lines, lnum = findsource(object) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/inspect.py", line 531, in findsource 
    raise IOError('could not get source code') 
IOError: could not get source code 
>>> 

Si inspect ne peut pas y accéder, c'est un signe assez indicatif.

Si vous étiez sur une plate-forme en utilisant GNU readline (essentiellement, tout sauf Windows), vous pourriez exploiter le fait que readline lui-même ne rappeler quelques « histoire » et peut l'écrire dans un fichier ... :

>>> readline.write_history_file('/tmp/hist.txt') 

puis de lire ce fichier d'historique - cependant, je ne connais aucun moyen de le faire sous Windows.

Vous pouvez utiliser un certain IDE avec de meilleures capacités de mémoire, plutôt que l'interpréteur de commandes "brut", en particulier sur une plate-forme telle que Windows.

+0

Je suis d'accord sur l'IDE.Mais le shell ressemble à une fenêtre de commande DOS et le PHB ne me demande pas ce que je fais. –

+0

peut-être cela une bonne demande de fonctionnalité pour l'inactivité ... –

+0

ipython peut aider pour un IDE riche à une fenêtre de commande DOS, voir http://ipython.scipy.org/moin/ - il est si riche que j'ai perdu la trace de la plupart de ses fonctionnalités maintenant ;-). –

0

À moins qu'il y ait un moyen de le faire sur le shell activestate, non, il n'y a aucun moyen de récupérer le code exact que vous avez tapé sur le shell. Au moins sur Linux, en utilisant le shell Python fourni par CPython, il n'y a pas de moyen particulier d'y parvenir. Peut-être en utilisant iPython. L'attribut func_code est un objet représentant le bytecode de fonction, la seule chose que vous pouvez obtenir de cet objet est le bytecode lui-même, pas le code "original".

+0

Sur Linux, 'readline.write_history_file' aiderait - mais pas sur Windows. –

1

Non, pas vraiment. Vous pouvez écrire yourfunc.func_code.co_code (le bytecode réellement compilé) dans un fichier, puis essayer de décompiler ou unpyc pour les décompiler, mais les deux projets sont vieux et non maintenus, et n'ont jamais supporté la décompilation.

Il est infiniment plus simple d'écrire simplement votre fonction dans un fichier pour commencer.

2

Cela fait longtemps que quelqu'un en a besoin. getsource donne le code source:

>>> def sum(a, b, c): 
... # sum of three number 
... return a+b+c 
... 
>>> from dill.source import getsource 
>>> 
>>> getsource(sum) 
'def sum(a, b, c):\n # sum of three number\n return a+b+c\n' 

pour installer dill run pip install dill. Pour obtenir formaté:

>>> fun = getsource(sum).replace("\t", " ").split("\n") 
>>> for line in fun: 
... print line 
... 
def sum(a, b, c): 
# sum of three number 
return a+b+c 
Questions connexes