Python có thể in định nghĩa hàm không?


112

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 bằng Python không?

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


Bạn có nguồn cho chức năng. Có gì sai với điều đó?
S.Lott

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

Có một bản sao của câu hỏi này: stackoverflow.com/questions/427453/…
Anderson Green,

Câu trả lời:


157

Nếu bạn đang nhập hàm, 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)

Điều này sẽ hoạt động trong dấu nhắc tương tác, nhưng dường như chỉ trên các đối tượng được nhập (không phải các đối tượng được xác định trong dấu nhắc tương tác). Và tất nhiên nó sẽ chỉ hoạt động nếu Python có thể tìm thấy mã nguồn (vì vậy không phải trên các đối tượng tích hợp sẵn, C libs, tệp .pyc, v.v.)


Chức năng được tạo ra trong thời gian chạy (bao gồm cả dấu nhắc tương tác) không có một tập tin hoặc linenumber một trong hai, có ý nghĩa
John La Rooy

Đó dường như là những gì tôi đang tìm kiếm. Cảm ơn!
Eddie Welker 14/10/09

9
Còn việc in định nghĩa hàm mà tôi đã xác định trước đó trong trình thông dịch Python tương tác hiện tại thì sao? Điều này có khả thi không?
GL2014

@ GL2014: Vâng, xem câu trả lời của tôi.
Mike McKern

Tôi có thể xác nhận rằng câu trả lời này và checks.getsource () hoạt động trên funciton được xác định tương tác (ipython3) trong Python 3.6.9 (Ubuntu).
Gnudiff

97

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


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

12

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

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

Thao tác này sẽ xóa các ký tự dòng mới và in hàm ra một cách độc đáo


1
Ví dụ bị hỏng ở đó, nó phải là i.getsource (MyFunction).
svth

10

Mặc dù tôi thường đồng ý rằng đó inspectlà một câu trả lời tốt, nhưng 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.getsourcetừ dill, bạn có thể lấy nguồn của các hàm và lambdas, ngay cả khi chúng được định nghĩa tương tác. Nó cũng có thể lấy mã từ các phương thức và chức năng của lớp có ràng buộc hoặc không liên kết được định nghĩa trong curries ... tuy nhiên, bạn có thể không biên dịch được mã đó nếu không có mã của đối tượng đi kèm.

>>> 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
đôi khi nó không làm việc trực tiếp với: getsource (my_function) , nhưng sau đó tôi có thể nhận được nó để làm việc với getsource (my_function.func_code)
cãm hứng

2

Sử dụng help(function)để lấy mô tả chức năng.

Bạn có thể đọc thêm về help() ở đây .


1
không có nguồn được xác định trong trợ giúp cho tôi.
ansuman

-6

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

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

1
Khi ở trong shell tương tác, "help (object)" sẽ hiển thị điều này theo cách dễ điều hướng hơn.
TK.

@kaizer Chữ ký hàm cũng không phải là một định nghĩa. Những gì __doc__ thực sự trả về là bất cứ điều gì mà tác giả của mã đặt trong chuỗi doc (chuỗi được trích dẫn ba). Không hơn không kém.
Triptych

Tôi nghĩ rằng định nghĩa là mơ hồ ở đây. Đối với tôi nó có thể có nghĩa là docstring hoặc văn bản mã hoặc cả hai hoặc thậm chí các đối tượng mã tại một căng
John La Rooy

-6

Bạn có thể sử dụng hàm __doc__trong, lấy hog()chức năng làm ví dụ: Bạn có thể xem cách sử dụng hog()như sau:

from skimage.feature import hog

print hog.__doc__

Đầu ra 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.

1
Câu hỏi là về định nghĩa hàm chứ không phải hàm docstring.
ctrl-alt-delor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.