2009-10-13 20 views
66

JavaScript'te, bir işlev tanımının çıktısını alabilirsiniz. Bunu Python'da başarmanın bir yolu var mı?Python bir işlev tanımı yazdırabilir mi?

(Sadece etkileşimli modda oynamak ve açmaksızın bir modül okumak istedim(). Sadece merak ettim). o eğer

+0

güzel işlevini yazdırır. Bunun derdi ne? –

+0

Ve etkileşimli moddan, işlevin docstring'ini görüntülemek için yardım (işlev) kullanabilirsiniz. – monkut

+0

Bu sorunun bir kopyası var: http://stackoverflow.com/questions/427453/how-can-i-get-the-source-code-of-a-python-function –

cevap

93

, sen inspect.getsource kullanabilirsiniz:

>>> 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, ancak görünüşe göre sadece (interaktif istemi içinde tanımlanmamış nesneler) ithal edilmektedir nesneler üzerinde interaktif isteminde eser .

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

Çalışma zamanında oluşturulan etkileşimler (etkileşimli istemi de dahil olmak üzere) bir dosyaya veya çarşafıma sahip değildir, bu da mantıklı olan –

+0

Bu benim aradığım şey gibi görünüyor. Teşekkürler! –

+6

Geçerli 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

64
Eğer iPython kullanıyorsanız, size function_name? yardım almak için kullanabileceğiniz

ve function_name?? kaynağında basar. Eğer fonksiyonunu içe yapıyorsanız

+3

+1, ipython harika! Bir bağlantı ekleyebilirsin: http://ipython.scipy.org/ – orip

+0

Bazen işlevi çağırmak için başka bir satıra ayırmanız gerekir? Örneğin. model.function ?? çalışmıyor ama f = model.function; f ?? çalışır – thecheech

-3

(dahili nesneler, C kütüphaneleri, .pyc dosyaları vb bu kadar değil) çalışacak Genel olarak inspect'un iyi bir yanıt olduğunu kabul edersem, yorumlayıcıda tanımlanan nesnelerin kaynak kodunu alamazsınız. dill'dan dill.source.getsource kullanırsanız, etkileşimli olarak tanımlanmış olsa bile, işlevlerin kaynağı ve lambdalar alabilirsiniz. Ayrıca, körüklerde tanımlanan ciltli veya bağlı olmayan sınıf yöntemleri ve işlevleri için kod da alabilirsiniz ... ancak, bu kodu, örtülü nesnenin kodu olmadan derleyemeyebilirsiniz. Böyle hog() kullanımını görebilirsiniz :

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

Bu açıklama, tanımı değil.Birçok yerleşik için – Triptych

+0

(kural olarak, C modüllerinde tanımlanan fonksiyonlar), fonksiyon imzasını da içerir, fakat genel olarak değil. – u0b34a0f6ae

+1

Etkileşimli kabukta iken "yardım (nesne)" bunu daha kolay bir şekilde görüntüleyecektir. –

8

: Python kaynak kodunu bulabilirsek tabii ki sadece sen __doc__ kelime kullanabilirsiniz

+0

bazen doğrudan ile çalışmıyor: ** getsource (my_function) **, ama sonra ** ile çalışmayabilirdim kaynak (my_function.func_code) ** – Afflatus

+0

veya alternatif olarak: getsource (my_function .__ code__) – Afflatus

+0

boşta çalışmak değil –

-3

Sen işlevinde __doc__ kullanmak örnek olarak hog() fonksiyonunu alabilir

from skimage.feature import hog 

print hog.__doc__ 

çıkışı 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. 
+0

Sorunun işlevi işlev tanımıyla ilgili değil. –

1

Bunu nasıl yapacağımı anladım:

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

Bu yeni hat karakterleri alır ve sen işlev için kaynağına sahip