Отображение определения функции в интерактивной оболочке - PullRequest
12 голосов
/ 03 февраля 2010

Я работаю в Python Interactive Shell (ActiveState ActivePython 2.6.4 под Windows XP). Я создал функцию, которая делает то, что я хочу. Тем не менее, я очистил экран, поэтому я не могу вернуться и посмотреть на определение функции. Это также многострочная функция, поэтому стрелка вверх для повторного отображения линий имеет минимальное значение. В любом случае, чтобы вернуть реальный код функции? Есть атрибуты " code " и "func_code", отображаемые функцией dir (), но я не знаю, содержат ли они то, что мне нужно.

Ответы [ 4 ]

11 голосов
/ 03 февраля 2010

Нет, __code__ и func_code являются ссылками на скомпилированный байт-код - вы можете разобрать их (см. dis.dis), но не можете вернуться к исходному коду Python.

Увы, исходный код просто пропал, нигде не запоминается ...:

>>> 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
>>> 

Если inspect не может добраться до него, это довольно показательный знак.

Если вы работали на платформе, использующей GNU readline (в основном, любую кроме Windows), вы могли бы использовать тот факт, что readline сам действительно запоминает некоторую "историю" и может записать его в файл ...:

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

и затем прочитайте этот файл истории - однако я не знаю, как это сделать в Windows.

Возможно, вы захотите использовать некоторые IDE с лучшими возможностями памяти, а не «сырой» интерпретатор команд, особенно на такой платформе, как Windows.

3 голосов
/ 06 ноября 2015

Прошло довольно много времени, но может кому-то это нужно. getsource дает исходный код:

>>> 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'

для установки dill Запустите pip install dill. Чтобы получить его в формате:

>>> 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
1 голос
/ 03 февраля 2010

Нет, не совсем. Вы можете записать yourfunc.func_code.co_code (фактически скомпилированный байт-код) в файл и затем попытаться использовать декомпиляцию или unpyc для их декомпиляции, но оба проекта старые и не поддерживаются и никогда не поддерживали декомпиляцию очень хорошо.

Для начала гораздо проще просто записать свою функцию в файл.

0 голосов
/ 03 февраля 2010

Если нет способа сделать это в оболочке activestate, нет, нет способа получить точный код, который вы набрали в оболочке. По крайней мере, в Linux, используя оболочку Python, предоставленную CPython, нет особого способа добиться этого. Может быть, используя iPython.

Атрибут func_code - это объект, представляющий байт-код функции, единственное, что вы можете получить из этого объекта, - это сам байт-код, а не «оригинальный» код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...