Может ли Python распечатать определение функции?

114

В JavaScript можно распечатать определение функции. Есть ли способ сделать это в Python?

(Просто поигрался в интерактивном режиме, и я хотел прочитать модуль без open (). Мне было просто любопытно).

Эдди Велкер
источник
У вас есть источник функции. Что случилось с этим?
S.Lott
1
А в интерактивном режиме вы можете использовать справку (функцию) для отображения строки документации для функции.
монкут
Есть дубликат этого вопроса: stackoverflow.com/questions/427453/…
Андерсон Грин,

Ответы:

158

Если вы импортируете функцию, вы можете использовать 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)

Это будет работать в интерактивном приглашении, но, очевидно, только для импортируемых объектов (не для объектов, определенных в интерактивном приглашении). И, конечно, это будет работать только в том случае, если Python сможет найти исходный код (а не на встроенных объектах, библиотеках C, файлах .pyc и т. Д.)

Триптих
источник
Функции, которые создаются во время выполнения (включая интерактивную подсказку), также не имеют номера файла или белья, что имеет смысл
Джон Ла Рой,
Кажется, это то, что я искал. Спасибо!
Эдди Велкер,
9
А как насчет печати определения функции, которую я определил ранее в текущем интерактивном интерпретаторе Python? Это возможно?
GL2014,
@ GL2014: Да, посмотри мой ответ.
Майк МакКернс,
Я могу подтвердить, что этот ответ и inspect.getsource () ДЕЙСТВИТЕЛЬНО работают с интерактивной (ipython3) функцией, определенной в Python 3.6.9 (Ubuntu).
Gnudiff,
97

Если вы используете iPython , вы можете использовать его function_name?для получения справки и function_name??распечатать исходный код, если это возможно.

Питер
источник
2
иногда вам нужно выделить функцию в другую строку для вызова? например, модель.функция ?? не работает, но f = model.function; е ?? работает
thecheech 06
12

Вот как я понял, как это сделать:

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

Это удаляет символы новой строки и красиво выводит функцию

Стив
источник
1
Здесь сломанный пример, это должен быть i.getsource (MyFunction).
svth
10

Хотя я в целом согласен, что inspectэто хороший ответ, я не согласен с тем, что вы не можете получить исходный код объектов, определенных в интерпретаторе. Если вы используете dill.source.getsourcefrom dill, вы можете получить источник функций и лямбда-выражений, даже если они определены интерактивно. Он также может получать код из связанных или несвязанных методов и функций класса, определенных в карри ... однако вы не сможете скомпилировать этот код без кода окружающего объекта.

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

>>> 
Майк МакКернс
источник
1
иногда он не работает напрямую с: getsource (my_function) , но тогда я мог бы заставить его работать с getsource (my_function.func_code)
Afflatus
3

Используйте help(function)для получения описания функции.

Подробнее об этом можно прочитать help() здесь .

Сафван
источник
1
не указал источник в справке для меня.
ansuman
-6

Вы можете использовать ключевое слово __doc__:

#print the class description
print string.__doc__
#print function description
print open.__doc__
Амиршк
источник
1
Это описание, а не определение.
Триптих
для многих встроенных функций (как правило, функций, определенных в модулях C) он также включает сигнатуру функции, но не в целом.
u0b34a0f6ae
1
В интерактивной оболочке «help (object)» будет отображать это более удобным для навигации способом.
ТЗ.
@kaizer Сигнатура функции тоже не является определением. На __doc__ самом деле возвращается то, что автор кода поместил в строку документа (строку в тройных кавычках). Ни больше ни меньше.
Триптих
Думаю, определение здесь неоднозначное. Для меня это может означать строку документации, или текст кода, или и то, и другое, или даже объект кода по отдельности
Джон Ла Рой,
-6

Вы можете использовать __doc__в функции, возьмите hog()функцию в качестве примера: Вы можете увидеть, hog()как это используется:

from skimage.feature import hog

print hog.__doc__

Результат будет:

Extract Histogram of Oriented Gradients (HOG) for a given image.
Compute a Histogram of Oriented Gradients (HOG) by

    1. (optional) global image normalisation
    2. computing the gradient image in x and y
    3. computing gradient histograms
    4. normalising across blocks
    5. flattening into a feature vector

Parameters
----------
image : (M, N) ndarray
    Input image (greyscale).
orientations : int
    Number of orientation bins.
pixels_per_cell : 2 tuple (int, int)
    Size (in pixels) of a cell.
cells_per_block  : 2 tuple (int,int)
    Number of cells in each block.
visualise : bool, optional
    Also return an image of the HOG.
transform_sqrt : bool, optional
    Apply power law compression to normalise the image before
    processing. DO NOT use this if the image contains negative
    values. Also see `notes` section below.
feature_vector : bool, optional
    Return the data as a feature vector by calling .ravel() on the result
    just before returning.
normalise : bool, deprecated
    The parameter is deprecated. Use `transform_sqrt` for power law
    compression. `normalise` has been deprecated.

Returns
-------
newarr : ndarray
    HOG for the image as a 1D (flattened) array.
hog_image : ndarray (if visualise=True)
    A visualisation of the HOG image.

References
----------
* http://en.wikipedia.org/wiki/Histogram_of_oriented_gradients

* Dalal, N and Triggs, B, Histograms of Oriented Gradients for
  Human Detection, IEEE Computer Society Conference on Computer
  Vision and Pattern Recognition 2005 San Diego, CA, USA

Notes
-----
Power law compression, also known as Gamma correction, is used to reduce
the effects of shadowing and illumination variations. The compression makes
the dark regions lighter. When the kwarg `transform_sqrt` is set to
``True``, the function computes the square root of each color channel
and then applies the hog algorithm to the image.
startag.cv
источник
1
Вопрос касался определения функции, а не строки документации функции.
ctrl-alt-delor