Czy Python może wydrukować definicję funkcji?

113

W JavaScript można wydrukować definicję funkcji. Czy istnieje sposób, aby to osiągnąć w Pythonie?

(Po prostu bawiłem się w trybie interaktywnym i chciałem przeczytać moduł bez open (). Byłem po prostu ciekawy).

Eddie Welker
źródło
Masz źródło funkcji. Co z tym jest nie tak?
S.Lott
1
W trybie interaktywnym możesz użyć pomocy (funkcji), aby wyświetlić ciąg dokumentacyjny funkcji.
monkut
Istnieje duplikat tego pytania: stackoverflow.com/questions/427453/ ...
Anderson Green

Odpowiedzi:

157

Jeśli importujesz funkcję, możesz użyć 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)

Działa to w zgłoszeniu interaktywnym, ale najwyraźniej tylko w przypadku importowanych obiektów (a nie obiektów zdefiniowanych w monicie interaktywnym). I oczywiście zadziała tylko wtedy, gdy Python może znaleźć kod źródłowy (a więc nie w przypadku obiektów wbudowanych, bibliotek C, plików .pyc itp.)

Tryptyk
źródło
Funkcje, które są tworzone w czasie wykonywania (w tym interaktywny monit), również nie mają pliku ani numeru linii, co ma sens
John La Rooy
Wydaje się, że właśnie tego szukałem. Dzięki!
Eddie Welker
9
A co z wydrukowaniem definicji funkcji, którą zdefiniowałem wcześniej w obecnym interaktywnym interpreterze Pythona? czy to możliwe?
GL2014
@ GL2014: Tak, zobacz moją odpowiedź.
Mike McKerns,
Mogę potwierdzić, że ta odpowiedź i inspect.getsource () CZY prace nad interaktywnym (ipython3) zdefiniowany funciton w Pythonie 3.6.9 (Ubuntu).
Gnudiff
97

Jeśli używasz iPythona , możesz użyć, function_name?aby uzyskać pomoc i function_name??wydrukuje źródło, jeśli to możliwe.

Piotr
źródło
2
czasami trzeba oddzielić funkcję do innej linii, aby zadzwonić? np. model.function ?? nie działa, ale f = model.function; fa?? prace
thecheech
12

Oto sposób, w jaki odkryłem, jak to zrobić:

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

To usuwa znaki nowego wiersza i ładnie wypisuje funkcję

Steve
źródło
1
Zepsuty przykład, powinien to być i.getsource (MyFunction).
svth
10

Chociaż generalnie zgadzam się, że inspectjest to dobra odpowiedź, nie zgodziłbym się, że nie można uzyskać kodu źródłowego obiektów zdefiniowanych w interpreterze. Jeśli używasz dill.source.getsourcefrom dill, możesz uzyskać źródło funkcji i lambd, nawet jeśli są zdefiniowane interaktywnie. Może również pobrać kod z powiązanych lub niezwiązanych metod klas i funkcji zdefiniowanych w curry ... jednak może nie być w stanie skompilować tego kodu bez kodu otaczającego obiektu.

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

>>> 
Mike McKerns
źródło
1
czasami nie działa bezpośrednio z: getsource (my_function) , ale potem mogłem go zmusić do pracy z getsource (my_function.func_code)
Afflatus
3

Użyj, help(function)aby uzyskać opis funkcji.

Możesz przeczytać więcej na ten temat help() tutaj .

Safwan
źródło
1
nie ma zdefiniowanego źródła w pomocy dla mnie.
ansuman
-6

Możesz użyć słowa kluczowego __doc__:

#print the class description
print string.__doc__
#print function description
print open.__doc__
Amirshk
źródło
1
To jest opis, a nie definicja.
Tryptyk
w przypadku wielu wbudowanych (z reguły funkcji zdefiniowanych w modułach C) zawiera również sygnaturę funkcji, ale nie ogólnie.
u0b34a0f6ae
1
Będąc w powłoce interaktywnej, „pomoc (obiekt)” wyświetli to w bardziej przyjazny dla nawigacji sposób.
TK.
@kaizer Podpis funkcji również nie jest definicją. To, co w __doc__ rzeczywistości zwraca, to cokolwiek, co autor kodu umieścił w ciągu dokumentacyjnym (ciąg potrójny cudzysłów). Nic dodać nic ująć.
Tryptyk
Myślę, że definicja jest tutaj niejednoznaczna. Dla mnie może to oznaczać ciąg dokumentacyjny lub tekst kodu lub oba, a nawet obiekt kodu na odcinku
John La Rooy
-6

Możesz użyć funkcji __doc__w funkcji, weź hog()funkcję jako przykład: Możesz zobaczyć użycie w hog()ten sposób:

from skimage.feature import hog

print hog.__doc__

Wynik będzie:

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
źródło
1
Pytanie dotyczyło definicji funkcji, a nie dokumentacji funkcji.
ctrl-alt-delor