Чи може Python друкувати визначення функції?


112

У JavaScript можна роздрукувати визначення функції. Чи є спосіб досягти цього в Python?

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


У вас є джерело функції. Що з цим?
S.Lott

1
А в інтерактивному режимі ви можете використовувати довідку (функцію) для відображення докстрингу для функції.
monkut

Дублікат цього питання: stackoverflow.com/questions/427453/…
Anderson Green

Відповіді:


157

Якщо ви імпортуєте функцію, ви можете використовувати 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 libs, .pyc файлах тощо)


У функціях, створених під час виконання (включаючи інтерактивну підказку), також немає файлу чи рядка, що має сенс
John La Rooy

Це, здається, те, що я шукав. Дякую!
Едді Велкер

9
Як щодо друку визначення функції, яку я визначив раніше в поточному інтерактивному інтерпретаторі Python? Чи можливо це?
GL2014

@ GL2014: Так, дивіться мою відповідь.
Майк Маккернс

Я можу підтвердити , що ця відповідь і inspect.getsource () РОБИТЬ роботу на інтерактивній (ipython3) , певний Funciton в Python 3.6.9 (Ubuntu).
Gnudiff

97

Якщо ви використовуєте iPython , ви можете скористатися function_name?допомогою, щоб отримати довідку і function_name??, якщо це можливо , буде надруковано джерело.


2
іноді вам потрібно відокремити функцію в іншу лінію для дзвінка? наприклад модель.функція ?? не працює, але f = model.function; f ?? твори
thecheech

12

Ось як я зрозумів, як це зробити:

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

Це виймає нові символи рядків і добре виводить функцію


1
Розбитий приклад там, він повинен бути i.getsource (MyFunction).
svth

10

Хоча я, як правило, погоджуюся, що inspectце хороша відповідь, я не погоджуюся з тим, що ви не можете отримати вихідний код об'єктів, визначений в інтерпретаторі. Якщо ви використовуєте dill.source.getsourceз dill, ви можете отримати вихідні тексти функцій і лямбда, навіть якщо вони визначені в інтерактивному режимі . Він також може отримати код для зв'язаних або незв'язаних методів та функцій класу, визначених у curries ... однак, ви не зможете скласти цей код без коду об'єкта, що додається.

>>> 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
іноді це не працює безпосередньо з: getource (my_function) , але тоді я можу змусити його працювати з getource (my_function.func_code)
Afflatus

2

Використовуйте help(function)для отримання опису функції.

Більше про це можна прочитати help() тут .


1
не було визначено джерело в допомозі для мене.
ansuman

-6

Ви можете використовувати ключове слово __doc__:

#print the class description
print string.__doc__
#print function description
print open.__doc__

1
Це опис, а не визначення.
Триптих

для багатьох вбудованих (як правило, функцій, визначених у модулях C), вона включає також підпис функції, але не в цілому.
u0b34a0f6ae

1
Перебуваючи в інтерактивній оболонці, "довідка (об'єкт)" відобразить це в більш навігаційному вигляді.
ТЗ.

@kaizer Підпис функції також не є визначенням. Що __doc__ насправді повертає, це все, що автор коду помістив у рядок doc (потрійний цитуваний рядок). Нічого більше, нічого менше.
Триптих

Я думаю, тут визначення неоднозначне. Для мене це може означати docstring або текст коду, або обидва, або навіть об'єкт коду на розтяжці
Джон Ла Руй

-6

Ви можете використовувати функцію __doc__in, взяти 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.

1
Питання полягало у визначенні функції не докстрингу функції.
ctrl-alt-delor
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.