Bisakah Python mencetak definisi fungsi?

112

Dalam JavaScript, seseorang dapat mencetak definisi suatu fungsi. Apakah ada cara untuk melakukannya dengan Python?

(Hanya bermain-main dalam mode interaktif, dan saya ingin membaca modul tanpa open (). Saya hanya penasaran).

Eddie Welker
sumber
Anda memiliki sumber untuk fungsi tersebut. Apa yang salah dengan itu?
S. Lott
1
Dan dari mode interaktif Anda dapat menggunakan bantuan (fungsi) untuk menampilkan docstring untuk fungsi tersebut.
monkut
Ada duplikat dari pertanyaan ini: stackoverflow.com/questions/427453/…
Anderson Green

Jawaban:

157

Jika Anda mengimpor fungsi, Anda dapat menggunakan 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)

Ini akan bekerja di prompt interaktif, tetapi tampaknya hanya pada objek yang diimpor (bukan objek yang ditentukan dalam prompt interaktif). Dan tentu saja itu hanya akan berfungsi jika Python dapat menemukan kode sumbernya (jadi tidak pada objek bawaan, C libs, file .pyc, dll)

Triptych
sumber
Fungsi yang dibuat saat runtime (termasuk prompt interaktif) juga tidak memiliki file atau nomor linen, yang masuk akal
John La Rooy
Sepertinya itulah yang saya cari. Terima kasih!
Eddie Welker
9
Bagaimana dengan mencetak definisi fungsi yang saya definisikan sebelumnya di interpreter Python interaktif saat ini? Apakah ini mungkin?
GL2014
@ GL2014: Ya, lihat jawaban saya.
Mike McKerns
Saya dapat mengonfirmasi bahwa jawaban ini dan inspect.getsource () TIDAK berfungsi pada fungsi yang didefinisikan secara interaktif (ipython3) di Python 3.6.9 (Ubuntu).
Gnudiff
97

Jika Anda menggunakan iPython , Anda dapat menggunakan function_name?untuk mendapatkan bantuan, dan function_name??akan mencetak sumbernya, jika bisa.

Peter
sumber
2
terkadang Anda perlu memisahkan fungsi ke baris lain untuk memanggil? misalnya model.function ?? tidak berfungsi tetapi f = model.function; f ?? bekerja
theecheech
12

Inilah cara saya menemukan cara melakukannya:

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

Ini mengeluarkan karakter baris baru dan mencetak fungsinya dengan baik

Steve
sumber
1
Contoh rusak di sana, harus i.getsource (MyFunction).
svth
10

Meskipun saya umumnya setuju bahwa itu inspectadalah jawaban yang bagus, saya tidak setuju bahwa Anda tidak bisa mendapatkan kode sumber objek yang ditentukan di interpreter. Jika Anda menggunakan dill.source.getsourcefrom dill, Anda bisa mendapatkan sumber fungsi dan lambda, meskipun keduanya didefinisikan secara interaktif. Itu juga bisa mendapatkan kode untuk dari metode kelas terikat atau tidak terikat dan fungsi yang ditentukan dalam kari ... namun, Anda mungkin tidak dapat mengkompilasi kode itu tanpa kode objek yang melingkupinya.

>>> 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
sumber
1
kadang-kadang tidak bekerja secara langsung dengan: getsource (my_function) , tetapi kemudian saya bisa membuatnya berfungsi dengan getsource (my_function.func_code)
Afflatus
2

Gunakan help(function)untuk mendapatkan deskripsi fungsi.

Anda dapat membaca lebih lanjut di help() sini .

Safwan
sumber
1
tidak memiliki sumber yang ditentukan untuk membantu saya.
ansuman
-6

Anda dapat menggunakan kata kunci __doc__:

#print the class description
print string.__doc__
#print function description
print open.__doc__
Amirshk
sumber
1
Itulah deskripsinya, bukan definisinya.
Triptych
untuk banyak bawaan (sebagai aturan, fungsi yang ditentukan dalam modul C), ini menyertakan tanda tangan fungsi juga, tetapi tidak secara umum.
u0b34a0f6ae
1
Sementara di shell interaktif "help (object)" akan menampilkan ini dengan cara yang lebih mudah dinavigasi.
TK.
@kaizer Tanda tangan fungsi juga bukan definisi. Apa yang __doc__ sebenarnya dikembalikan adalah apa pun yang dimasukkan oleh pembuat kode ke dalam string doc (string yang dikutip tiga kali lipat). Tidak lebih, tidak kurang.
Triptych
Saya pikir definisi di sini ambigu. Bagi saya itu bisa berarti docstring atau teks kode atau keduanya atau bahkan objek kode sekaligus
John La Rooy
-6

Anda dapat menggunakan __doc__fungsi in, ambil hog()fungsi sebagai contoh: Anda dapat melihat penggunaan hog()seperti ini:

from skimage.feature import hog

print hog.__doc__

Outputnya adalah:

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
sumber
1
Pertanyaannya tentang definisi fungsi bukan fungsi docstring.
ctrl-alt-delor