Python bir işlev tanımını yazdırabilir mi?


113

JavaScript'te, bir işlevin tanımı yazdırılabilir. Python'da bunu başarmanın bir yolu var mı?

(Sadece etkileşimli modda oynuyorum ve bir modülü open () olmadan okumak istedim. Sadece merak ettim).


Fonksiyon için kaynağa sahipsiniz. Bunun derdi ne?
S.Lott

1
Ve etkileşimli moddan, işlev için belge dizisini görüntülemek için yardım (işlev) kullanabilirsiniz.
monkut

Yanıtlar:


157

Fonksiyonu içe aktarıyorsanız, şunları kullanabilirsiniz 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)

Bu olacak ama görünüşe göre sadece (interaktif istemi içinde tanımlanmış nesnelerin değil) ithal edilen nesneler üzerinde, interaktif isteminde çalışır. Ve tabii ki yalnızca Python kaynak kodunu bulabilirse çalışacaktır (yani yerleşik nesnelerde, C kitaplıklarında, .pyc dosyalarında vb.)


Çalışma zamanında oluşturulan işlevlerin (etkileşimli komut istemi dahil) bir dosyası veya keten numarası da yoktur, bu da mantıklıdır
John La Rooy

Aradığım şey bu galiba. Teşekkürler!
Eddie Welker

9
Mevcut etkileşimli Python yorumlayıcısında daha önce tanımladığım bir işlev tanımını yazdırmaya ne dersiniz? Mümkün mü?
GL2014

@ GL2014: Evet, cevabıma bakın.
Mike McKerns

Bu cevap ve inspect.getsource () teyit edebiliriz MU Python 3.6.9 (Ubuntu) interaktif (ipython3) üzerinde çalışmaya tanımlı funciton.
Gnudiff

97

İPython kullanıyorsanız , function_name?yardım almak için kullanabilirsiniz ve function_name??mümkünse kaynağı yazdırabilirsiniz.


2
Bazen işlevi aramak için başka bir hatta ayırmanız gerekir. örneğin model.function ?? çalışmıyor ama f = model.function; f ?? işler
konuşma

12

Bunu nasıl yapacağımı şu şekilde çözdüm:

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

Bu, yeni satır karakterlerini çıkarır ve işlevi güzel bir şekilde yazdırır


1
Oradaki bozuk örnek, i.getsource (MyFunction) olmalıdır.
svth

10

Genel inspectolarak bunun iyi bir cevap olduğunu kabul etsem de, yorumlayıcıda tanımlanan nesnelerin kaynak kodunu alamayacağınız konusunda hemfikir değilim. Eğer kullanırsanız dill.source.getsourcedan dill, onlar interaktif tanımlanmış olsa dahi, işlevleri ve lambdas kaynağını elde edebilirsiniz. Ayrıca, curries içinde tanımlanan bağlı veya bağlantısız sınıf yöntemlerinden ve işlevlerinden kod alabilir ... ancak, bu kodu çevreleyen nesnenin kodu olmadan derleyemeyebilirsiniz.

>>> 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
bazen doğrudan şununla çalışmaz: getsource (my_function) , ancak sonra onu getsource (my_function.func_code)
Afflatus

3

help(function)İşlev açıklamasını almak için kullanın .

help() Buradan daha fazlasını okuyabilirsiniz .


1
bana yardım etmek için tanımlanmış kaynak yoktu.
ansuman

-6

__Doc__ anahtar kelimesini kullanabilirsiniz:

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

1
Tanım bu, tanım değil.
Triptych

birçok yerleşik için (kural olarak, C modüllerinde tanımlanan işlevler), işlev imzasını da içerir, ancak genel olarak içermez.
u0b34a0f6ae

1
Etkileşimli kabukta iken "yardım (nesne)" bunu daha gezilebilir bir şekilde gösterecektir.
TK.

@kaizer Bir işlev imzası da bir tanım değildir. Ne __doc__ aslında döner doc dizesinde kod koymak (üçlü alıntı dize) ne olursa olsun yazarıdır. Ne fazla ne eksik.
Triptych

Bence burada tanım belirsiz. Benim için bu, docstring veya kod metni veya her ikisini de ifade edebilir veya hatta bir
streçteki

-6

İşlevde __doc__işlevini kullanabilir, hog()işlevi örnek olarak alabilirsiniz : Bunun hog()gibi kullanımlarını görebilirsiniz :

from skimage.feature import hog

print hog.__doc__

Çıktı şu şekilde olacaktır:

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
Soru, işlev docstring değil işlev tanımı hakkındaydı.
ctrl-alt-delor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.