2012-04-18 13 views
7

Trong phiên IPython, tôi thường xác định các chức năng tùy chỉnh ... vấn đề là, đôi khi tôi muốn xem mã thực tế cho các chức năng này. Cho đến nay, tôi đã không thể tìm thấy một cách để hiển thị này. Sử dụng? và ?? chỉ cần trả về "Chức năng được tạo động. Không có sẵn mã nguồn". Có cách nào để hiển thị mã nguồn cho các hàm do người dùng định nghĩa không?Làm thế nào để hiển thị mã nguồn cho chức năng được tạo động ("tùy chỉnh") trong IPython?

+0

Điều gì làm cho chức năng "tùy chỉnh"? Bạn có thể cung cấp một số nguồn cho biết cách bạn tạo chúng không? – kindall

+0

giống như: 'def blah (d, b): return (d> 10 và b <10)' (tương tác được xác định sẽ tốt hơn, xin lỗi) –

+2

Phiên bản IPython nào bạn có? Trong các phiên bản gần đây, 'f ??' hoạt động trên các hàm được xác định tương tác. –

Trả lời

2

Thử lịch sử tìm kiếm:

In [22]: for l in _ih: 
    ....:  if l.startswith('def f'): 
    ....:   print l 
    ....:   
    ....:   
def f(): 
    a= 1 
    b = 2 
    return a*b 

mặc dù điều này là rất cơ bản, một phiên bản tốt hơn sẽ phân tích/lịch sử chạy và xem nếu bạn có thể nhận một chức năng lại

2

Nếu bạn đang tìm kiếm các nguồn cho một chức năng tương tác được xác định, bạn có thể tìm thấy định nghĩa gần đây nhất của nó trong lịch sử của iPython:

[i for (i, l) in enumerate(_ih) if l.startswith('def foo(')][-1] 

Sau đó, bạn có thể chỉnh sửa dòng đó:

%edit 42 

Nó sẽ mở Notepad hoặc trình chỉnh sửa văn bản khác có định nghĩa chức năng trong đó.

Hoặc bạn có thể lưu vào một tập tin:

%save foo.py 42 
+0

Tác phẩm này, mặc dù trong trường hợp cụ thể này, tôi đã sử dụng một% paste để tất cả chỉ ra là lệnh dán ma thuật cho dòng đó. Giải pháp tốt nếu không, mặc dù –

2

Tôi đang sử dụng python 2.7.4 và ipython 0.13.2.

tôi có thể thấy nguồn gốc của một chức năng tự động tạo ra trong ipython sử dụng ?? trước tên hàm:

In [8]: ??sort_words 
Type:  function 
String Form:<function sort_words at 0x189b938> 
File:  /tmp/ipython_edit_yc1TIo.py 
Definition: sort_words(s) 
Source: 
def sort_words(s): 
    x = re.findall(r'\W+(\w+)', s) 
    x.sort() 
    for i in x: 
     print i 

Có lẽ đây là bây giờ đã có trong các phiên bản mới hơn của ipython? Phiên bản nào bạn đang sử dụng?

+0

có điều này là chính xác; Tôi hỏi câu hỏi này khi (tôi nghĩ) 0,12 không phải là phiên bản ổn định, và điều này không có sẵn trong 0,11. Xem bình luận của Thomas K về câu hỏi –

0

Fumctions trong IPython được coi là tạo động nếu:

  • họ đang metaprogrammed - họ được tạo ra bởi chức năng khác. trong trường hợp này không có mã nguồn, nó chỉ đơn giản là không tồn tại.

  • chúng được tham chiếu trong một không gian tên khác mà chúng được tạo và không có thông tin về không gian tên ban đầu của chúng. Trong trường hợp này, tìm ra nơi ban đầu và chạy? từ đó.

+0

Tôi không chắc tôi hiểu trường hợp "được lập trình meta" của bạn: trong IPython 1.1.0, ta có thể thấy với '??' mã của các hàm được tạo bên trong một hàm khác ('def f(): def g():… return g'). – EOL