2009-10-13 46 views
66

Trong JavaScript, người ta có thể in ra định nghĩa của một hàm. Có cách nào để thực hiện điều này trong Python?Python có thể in định nghĩa chức năng không?

(Chỉ cần phát xung quanh ở chế độ tương tác và tôi muốn đọc mô-đun mà không cần mở(). Tôi chỉ tò mò).

+0

Bạn có nguồn cho hàm. Có chuyện gì vậy? –

+0

Và từ chế độ tương tác, bạn có thể sử dụng trợ giúp (chức năng) để hiển thị chuỗi tài liệu cho hàm. – monkut

+0

Có một bản sao của câu hỏi này: http://stackoverflow.com/questions/427453/how-can-i-get-the-source-code-of-a-python-function –

Trả lời

93

Nếu bạn đang nhập các chức năng, bạn có thể sử dụng 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) 

này sẽ làm việc tại dấu nhắc tương tác, nhưng dường như chỉ có trên các đối tượng được nhập khẩu (không phải đối tượng được xác định trong sổ tương tác) . Và tất nhiên nó sẽ chỉ làm việc nếu Python có thể tìm mã nguồn (như vậy không phải trên built-in đối tượng, libs C, các file pyc, vv)

+0

Các chức năng được tạo khi chạy (bao gồm cả dấu nhắc tương tác) không có tệp hoặc lanh, hoặc có nghĩa là –

+0

Điều đó dường như là những gì tôi đang tìm kiếm. Cảm ơn! –

+6

Điều gì về việc in định nghĩa chức năng mà tôi đã xác định trước đó trong trình thông dịch Python tương tác hiện tại? Điều này có thể không? – GL2014

64

Nếu bạn đang sử dụng iPython, bạn có thể sử dụng function_name? để có được sự giúp đỡ, và function_name?? sẽ in ra nguồn gốc, nếu nó có thể.

+3

+1, ipython thật tuyệt vời! Bạn có thể thêm liên kết vào nó: http://ipython.scipy.org/ – orip

+0

đôi khi bạn cần tách chức năng này thành một dòng khác để gọi? ví dụ. model.function ?? không hoạt động nhưng f = model.function; f ?? hoạt động – thecheech

-3

Bạn có thể sử dụng từ khóa __doc__:

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

Đó là mô tả, không phải định nghĩa. – Triptych

+0

đối với nhiều nội trang (như một quy tắc, các hàm được định nghĩa trong các mô-đun C), nó cũng bao gồm chữ ký hàm, nhưng không bao gồm nói chung. – u0b34a0f6ae

+1

Trong khi trong vỏ tương tác "trợ giúp (đối tượng)" sẽ hiển thị điều này theo một cách điều hướng hơn. –

8

Trong khi tôi thường đồng ý rằng inspect là một câu trả lời hay, tôi không đồng ý rằng bạn không thể lấy mã nguồn của các đối tượng được xác định trong trình thông dịch. Nếu bạn sử dụng dill.source.getsource từ dill, bạn có thể lấy nguồn chức năng và lambdas, ngay cả khi chúng được xác định tương tác. Nó cũng có thể lấy mã cho từ các phương thức lớp và ràng buộc bị ràng buộc hoặc không ràng buộc được định nghĩa trong curries ... tuy nhiên, bạn không thể biên dịch mã đó mà không có mã của đối tượng kèm theo.

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

>>> 
+0

đôi khi nó không hoạt động trực tiếp với: ** getource (my_function) **, nhưng sau đó tôi có thể làm cho nó hoạt động với ** getource (my_function.func_code) ** – Afflatus

+0

hoặc cách khác: getource (my_function .__ code__) – Afflatus

+0

không hoạt động ở chế độ chờ nhàn rỗi –

-3

Bạn có thể sử dụng __doc__ trong hàm, mất hog() chức năng làm ví dụ: Bạn có thể thấy việc sử dụng hog() như thế này:

from skimage.feature import hog 

print hog.__doc__ 

Kết quả sẽ là:

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

Câu hỏi về chức năng định nghĩa không phải chức năng docstring. –

1

Đây là cách tôi đã tìm ra cách thực hiện:

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

Thao tác này sẽ lấy các ký tự dòng mới và in chức năng độc đáo

Các vấn đề liên quan