Hướng dẫn how do you print the source code of a function in python? - làm thế nào để bạn in mã nguồn của một chức năng trong python?

Giả sử tôi có chức năng Python như được định nghĩa dưới đây:

def foo[arg1,arg2]:
    #do something with args
    a = arg1 + arg2
    return a

Tôi có thể lấy tên của chức năng bằng

import inspect
lines = inspect.getsource[foo]
print[lines]
0. Làm thế nào tôi có thể lập trình lấy mã nguồn của nó, như tôi đã nhập ở trên?

Vertexwahn

7.7486 huy hiệu vàng60 Huy hiệu bạc88 Huy hiệu đồng6 gold badges60 silver badges88 bronze badges

hỏi ngày 9 tháng 1 năm 2009 lúc 9:02Jan 9, 2009 at 9:02

3

Nếu hàm từ tệp nguồn có sẵn trên hệ thống tập tin, thì

import inspect
lines = inspect.getsource[foo]
print[lines]
1 có thể giúp đỡ:

Nếu

import inspect
lines = inspect.getsource[foo]
print[lines]
2 được định nghĩa là:

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a  

Sau đó:

import inspect
lines = inspect.getsource[foo]
print[lines]

Trả lại:

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a                

Nhưng tôi tin rằng nếu hàm được biên dịch từ một chuỗi, luồng hoặc nhập từ tệp được biên dịch, thì bạn không thể truy xuất mã nguồn của nó.

Manoj thông minh

4.6484 Huy hiệu vàng28 Huy hiệu bạc53 Huy hiệu Đồng4 gold badges28 silver badges53 bronze badges

Đã trả lời ngày 9 tháng 1 năm 2009 lúc 9:44Jan 9, 2009 at 9:44

Rafał Dowgirdrafał DowgirdRafał Dowgird

41.8K11 Huy hiệu vàng77 Huy hiệu bạc89 Huy hiệu đồng11 gold badges77 silver badges89 bronze badges

9

Mô -đun kiểm tra có các phương thức truy xuất mã nguồn từ các đối tượng Python. Dường như nó chỉ hoạt động nếu nguồn được đặt trong một tập tin mặc dù. Nếu bạn có điều đó, tôi đoán bạn sẽ không cần phải lấy nguồn từ đối tượng.

Các thử nghiệm sau đây

import inspect
lines = inspect.getsource[foo]
print[lines]
1 bằng Python 3.6:

import inspect

def foo[arg1,arg2]:
    #do something with args
    a = arg1 + arg2
    return a

source_foo = inspect.getsource[foo]  # foo is normal function
print[source_foo]

source_max = inspect.getsource[max]  # max is a built-in function
print[source_max]

Bản in đầu tiên này:

def foo[arg1,arg2]:
    #do something with args
    a = arg1 + arg2
    return a

Sau đó, thất bại trên

import inspect
lines = inspect.getsource[foo]
print[lines]
4 với lỗi sau:

TypeError:  is not a module, class, method, function, traceback, frame, or code object

Đã trả lời ngày 9 tháng 1 năm 2009 lúc 9:25Jan 9, 2009 at 9:25

Runehrunehruneh

Phù hiệu vàng 3.5711 Huy hiệu bạc16 Huy hiệu đồng1 gold badge18 silver badges16 bronze badges

8

Chỉ cần sử dụng

import inspect
lines = inspect.getsource[foo]
print[lines]
5 hoặc
import inspect
lines = inspect.getsource[foo]
print[lines]
6.

Nếu bạn đang sử dụng ipython, thì bạn cần nhập

import inspect
lines = inspect.getsource[foo]
print[lines]
5 hoặc
import inspect
lines = inspect.getsource[foo]
print[lines]
6 để xem mã nguồn đầy đủ. Để chỉ xem tài liệu trong hàm, hãy sử dụng
import inspect
lines = inspect.getsource[foo]
print[lines]
9 hoặc
def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a                
0. Điều này cũng hoạt động trong Jupyter Notebook.

In [19]: foo??
Signature: foo[arg1, arg2]
Source:
def foo[arg1,arg2]:
    #do something with args
    a = arg1 + arg2
    return a

File:      ~/Desktop/
Type:      function

Đã trả lời ngày 9 tháng 5 năm 2016 lúc 9:11May 9, 2016 at 9:11

Prashanthprashanthprashanth

3,8554 Huy hiệu vàng22 Huy hiệu bạc42 Huy hiệu đồng4 gold badges22 silver badges42 bronze badges

3

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a                
1 là bạn của bạn nếu mã nguồn không khả dụng:

>>> import dis
>>> def foo[arg1,arg2]:
...     #do something with args
...     a = arg1 + arg2
...     return a
...
>>> dis.dis[foo]
  3           0 LOAD_FAST                0 [arg1]
              3 LOAD_FAST                1 [arg2]
              6 BINARY_ADD
              7 STORE_FAST               2 [a]

  4          10 LOAD_FAST                2 [a]
             13 RETURN_VALUE

Đã trả lời ngày 28 tháng 6 năm 2013 lúc 6:11Jun 28, 2013 at 6:11

Schlamarschlamarschlamar

9.0623 Huy hiệu vàng37 Huy hiệu bạc76 Huy hiệu đồng3 gold badges37 silver badges76 bronze badges

3

Mặc dù tôi thường đồng ý rằng

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a                
2 là một câu trả lời tốt, 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 phiên dịch. Nếu bạn sử dụng
def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a                
3 từ
def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a                
4, bạn có thể nhận được 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ã từ các phương thức và hàm lớp bị ràng buộc hoặc không liên kết được xác định trong các loại cà ri ... tuy nhiên, bạn có thể 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

>>> 

Đã trả lời ngày 24 tháng 1 năm 2014 lúc 17:51Jan 24, 2014 at 17:51

Mike McKernsmike McKernsMike McKerns

32.1k8 Huy hiệu vàng113 Huy hiệu bạc138 Huy hiệu đồng8 gold badges113 silver badges138 bronze badges

10

Để mở rộng câu trả lời của Runeh:

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a  
0

Chỉnh sửa: Như được chỉ ra bởi @0sh Ví dụ này hoạt động bằng cách sử dụng

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a                
5 nhưng không đơn giản
def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a                
6. Tuy nhiên, trong cả hai, khi nhập mã từ các tệp nguồn.

Đã trả lời ngày 3 tháng 8 năm 2014 lúc 17:23Aug 3, 2014 at 17:23

TomdottomtomdottomTomDotTom

5,8623 Huy hiệu vàng37 Huy hiệu bạc39 Huy hiệu Đồng3 gold badges37 silver badges39 bronze badges

2

Vì bài đăng này được đánh dấu là bản sao của bài đăng khác này, tôi trả lời ở đây cho trường hợp "Lambda", mặc dù OP không phải là về Lambdas.

Vì vậy, đối với các hàm Lambda không được xác định trong các dòng của riêng chúng: ngoài câu trả lời của Marko.ristin, bạn có thể muốn sử dụng mini-Lambda hoặc sử dụng Sympy như được đề xuất trong câu trả lời này.

  • def foo[arg1,arg2]:         
        #do something with args 
        a = arg1 + arg2         
        return a                
    
    7 nhẹ hơn và hỗ trợ bất kỳ loại hoạt động nào, nhưng chỉ hoạt động cho một biến duy nhất
  • def foo[arg1,arg2]:         
        #do something with args 
        a = arg1 + arg2         
        return a                
    
    8 nặng hơn nhưng được trang bị nhiều hơn với các hoạt động toán học/tính toán. Đặc biệt, nó có thể đơn giản hóa các biểu thức của bạn. Nó cũng hỗ trợ một số biến trong cùng một biểu thức.

Đây là cách bạn có thể làm điều đó bằng cách sử dụng

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a                
7:

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a  
1

Nó mang lại chính xác

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a  
2

Xem tài liệu

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a                
7 để biết chi tiết. Nhân tiện, tôi là tác giả;]

Đã trả lời ngày 19 tháng 4 năm 2019 lúc 10:02Apr 19, 2019 at 10:02

smariesmariesmarie

4.04421 huy hiệu bạc35 huy hiệu đồng21 silver badges35 bronze badges

1

Bạn có thể sử dụng mô -đun

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a                
2 để lấy mã nguồn đầy đủ cho điều đó. Bạn phải sử dụng phương thức
import inspect

def foo[arg1,arg2]:
    #do something with args
    a = arg1 + arg2
    return a

source_foo = inspect.getsource[foo]  # foo is normal function
print[source_foo]

source_max = inspect.getsource[max]  # max is a built-in function
print[source_max]
2 cho điều đó từ mô -đun
def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a                
2. Ví dụ:

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a  
3

Bạn có thể kiểm tra nó ra nhiều tùy chọn hơn trên liên kết dưới đây. Lấy mã Python của bạn

Szabolcs

3,81715 huy hiệu bạc36 Huy hiệu đồng15 silver badges36 bronze badges

Đã trả lời ngày 9 tháng 7 năm 2017 lúc 13:47Jul 9, 2017 at 13:47

để tóm tắt:

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a  
4

Đã trả lời ngày 3 tháng 1 năm 2017 lúc 17:35Jan 3, 2017 at 17:35

Douardodouardodouardo

6396 Huy hiệu bạc6 Huy hiệu Đồng6 silver badges6 bronze badges

0

Xin hãy nhớ rằng các câu trả lời được chấp nhận chỉ hoạt động nếu Lambda được đưa ra trên một dòng riêng biệt. Nếu bạn chuyển nó như một đối số cho một hàm và muốn truy xuất mã của Lambda làm đối tượng, vấn đề sẽ có một chút khó khăn vì

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a                
2 sẽ cung cấp cho bạn toàn bộ dòng.

Ví dụ: hãy xem xét một tệp

import inspect

def foo[arg1,arg2]:
    #do something with args
    a = arg1 + arg2
    return a

source_foo = inspect.getsource[foo]  # foo is normal function
print[source_foo]

source_max = inspect.getsource[max]  # max is a built-in function
print[source_max]
5:

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a  
5

Thực hiện nó mang lại cho bạn [tâm trí của sự bất đồng!]:

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a  
6

Để truy xuất mã nguồn của Lambda, đặt cược tốt nhất của bạn, theo ý kiến ​​của tôi, là đặt lại toàn bộ tệp nguồn [bằng cách sử dụng

import inspect

def foo[arg1,arg2]:
    #do something with args
    a = arg1 + arg2
    return a

source_foo = inspect.getsource[foo]  # foo is normal function
print[source_foo]

source_max = inspect.getsource[max]  # max is a built-in function
print[source_max]
6] và khớp nút Lambda AST theo số dòng và bối cảnh của nó.

Chúng tôi đã phải thực hiện chính xác rằng trong biểu tượng thư viện thiết kế của chúng tôi vì chúng tôi phải phân tích các chức năng Lambda mà chúng tôi chuyển qua làm đối số cho các nhà trang trí. Nó là quá nhiều mã để dán ở đây, vì vậy hãy xem việc thực hiện chức năng này.

Đã trả lời ngày 14 tháng 9 năm 2018 lúc 14:07Sep 14, 2018 at 14:07

Nếu bạn tự xác định đúng chức năng và đó là một định nghĩa tương đối ngắn, một giải pháp không có phụ thuộc sẽ là xác định hàm trong một chuỗi và gán eval [] của biểu thức cho chức năng của bạn.

Ví dụ.

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a  
7

sau đó tùy chọn để đính kèm mã gốc vào chức năng:

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a  
8

Đã trả lời ngày 17 tháng 4 năm 2012 lúc 17:44Apr 17, 2012 at 17:44

Cherplunkcherplunkcherplunk

851 Huy hiệu bạc1 Huy hiệu đồng1 silver badge1 bronze badge

4

Câu trả lời của Rafał Dowgird:

Tôi tin rằng nếu hàm được biên dịch từ chuỗi, luồng hoặc nhập từ tệp được biên dịch, thì bạn không thể truy xuất mã nguồn của nó.

Tuy nhiên, có thể truy xuất mã nguồn của một hàm được biên dịch từ một chuỗi, với điều kiện là mã biên dịch cũng đã thêm một mục vào

import inspect

def foo[arg1,arg2]:
    #do something with args
    a = arg1 + arg2
    return a

source_foo = inspect.getsource[foo]  # foo is normal function
print[source_foo]

source_max = inspect.getsource[max]  # max is a built-in function
print[source_max]
7 Dict:

def foo[arg1,arg2]:         
    #do something with args 
    a = arg1 + arg2         
    return a  
9

Đây là cách thư viện

import inspect

def foo[arg1,arg2]:
    #do something with args
    a = arg1 + arg2
    return a

source_foo = inspect.getsource[foo]  # foo is normal function
print[source_foo]

source_max = inspect.getsource[max]  # max is a built-in function
print[source_max]
8 tự động tạo các phương thức khác nhau cho các lớp, được đưa ra một tập hợp các thuộc tính mà lớp dự kiến ​​sẽ được khởi tạo. Xem mã nguồn của họ ở đây. Như nguồn giải thích, đây là một tính năng chủ yếu nhằm cho phép các trình gỡ lỗi như PDB bước qua mã.

Đã trả lời ngày 31 tháng 8 năm 2021 lúc 21:54Aug 31, 2021 at 21:54

mtoormtoormtoor

1731 Huy hiệu bạc7 Huy hiệu đồng1 silver badge7 bronze badges

Tôi tin rằng các tên biến không được lưu trữ trong các tệp PYC/PYD/PYO, vì vậy bạn không thể truy xuất các dòng mã chính xác nếu bạn không có tệp nguồn.

Đã trả lời ngày 9 tháng 1 năm 2009 lúc 9:38Jan 9, 2009 at 9:38

AbganabganAbgan

3.63221 Huy hiệu bạc31 Huy hiệu đồng21 silver badges31 bronze badges

Làm thế nào để bạn tìm thấy mã nguồn của một hàm trong Python?

Phương thức getSource [] được sử dụng để lấy mã nguồn của các đối tượng python ...
Cú pháp: Kiểm tra.getSource [Object].
Tham số: Tham số loại đối tượng, trong đó chúng tôi muốn mã nguồn ..
Loại trả về: Văn bản mã nguồn cho một đối tượng ..

Làm thế nào để bạn in một chức năng trong Python?

Hàm python print [] có bất kỳ số lượng tham số nào và in chúng ra trên một dòng văn bản.Các mục được chuyển đổi thành mẫu văn bản, được phân tách bằng khoảng trắng và có một '\ n' ở cuối [char "newline"].Khi được gọi với các tham số bằng không, print [] chỉ in '\ n' và không có gì khác.print[] function takes in any number of parameters, and prints them out on one line of text. The items are each converted to text form, separated by spaces, and there is a single '\n' at the end [the "newline" char]. When called with zero parameters, print[] just prints the '\n' and nothing else.

Mã đằng sau chức năng in trong Python là gì?

Python print [] hàm hàm in [] in thông báo được chỉ định vào màn hình hoặc thiết bị đầu ra tiêu chuẩn khác.Thông báo có thể là một chuỗi hoặc bất kỳ đối tượng nào khác, đối tượng sẽ được chuyển đổi thành một chuỗi trước khi được ghi vào màn hình.prints the specified message to the screen, or other standard output device. The message can be a string, or any other object, the object will be converted into a string before written to the screen.

Làm cách nào để mở mã nguồn trong Python?

Nhấp đúp vào a.Tập lệnh PY sẽ thực thi tập lệnh [và không thể gửi bất kỳ kết quả hữu ích nào đến màn hình].Để xem nguồn, bạn có thể mở a.Tệp PY với IDLE [đi kèm với Python] hoặc thậm chí Notepad mặc dù nên sử dụng trình soạn thảo văn bản hoặc IDE nâng cao hơn.

Bài Viết Liên Quan

Chủ Đề