Rất liên quan chặt chẽ đến: How can I programmatically change the argspec of a function in a python decorator?Làm thế nào tôi có thể thay đổi lập trình argspec của một hàm * không * trong một trình trang trí python?
Mô-đun trang trí cung cấp phương tiện để thực hiện chức năng trang trí bảo toàn argspec của chức năng được trang trí.
Nếu tôi xác định một hàm không được sử dụng làm trang trí, có cách nào để sao chép argspec của một hàm khác không? trường hợp sử dụng
Ví dụ:
class Blah(object):
def foo(self, *args, **kwargs):
""" a docstr """
result = bar(*args, **kwargs)
result = result**2 # just so it's clear we're doing something extra here...
return result
def bar(x, y, z=1, q=2):
""" a more useful docstr, saying what x,y,z,q do """
return x+y*z+q
Tôi muốn có foo
's argspec trông giống như bar
' s, nhưng nguồn gốc ở lại không thay đổi (ví dụ, inspect.getsource(foo)
vẫn sẽ hiển thị các result
rác). Mục đích chính của việc này là lấy tài liệu nhân sư và trợ giúp tương tác của ipython để hiển thị các đối số thích hợp.
Khi câu trả lời cho câu hỏi khác cho biết, decorator package hiển thị một cách để làm điều này, nhưng tôi bị lạc trong phần thịt của mã đó. Có vẻ như gói decorator
đang biên dịch lại nguồn, hoặc một cái gì đó tương tự. Tôi đã hy vọng một cách tiếp cận đơn giản hơn, ví dụ: một cái gì đó như foo.argspec = bar.argspec
, sẽ là có thể.
Vâng đó là một số nguồn lông mã trong hàm trang trí đó. Bạn nói đúng, nó đang xây dựng lại chức năng - tôi đề nghị cố gắng sử dụng lại classmethod FunctionMaker.create và xem cách bạn đi. – Hamish
Suy nghĩ về nó mặc dù, nó có vẻ như nó sẽ có nhiều công việc để làm điều đó, hơn là chỉ cải thiện chữ ký gốc, hoặc thêm một docblock thích hợp. – Hamish
'foo' thực sự là một phương thức, vì vậy đối số đầu tiên sẽ _always_ là đối tượng instantiated, trừ khi bạn muốn' foo' là một 'staticmethod'. Nếu không, sẽ rất khó để kiểm tra sự trợ giúp trên 'Blah.foo' và không thấy' self' là đối số đầu tiên trong chữ ký. Không phải để nói nó không phải là do-thể, chỉ cần rằng bạn có thể cần phải nhớ để tiền tố chữ ký 'bar' với' self'. –