def foo(a, b, c = 0):
return a+b
Tôi có hàng tá chức năng như 'foo', tất cả đều có số và tên đối số khác nhau. Có một cách phổ biến mà tôi có thể nhận được các giá trị trả lại của các chức năng này và làm chỉ là một hoạt động thêm duy nhất như pformat cho họ?Có thể sửa đổi giá trị trả về của một hàm không định nghĩa hàm mới trong python không?
Có, tôi chỉ có thể tạo ra một chức năng mới như sau:
func = ... # func can be got using getattr by name
def wrapper(*arg, **kw):
data = func(*arg, **kw)
return pprint.pformat(data)
return wrapper
Nhưng sau đó các chức năng mới 'wrapper' khác với cái cũ 'func', ví dụ, trong số lập luận, 'wrapper 'chỉ có 2 args -' arg 'và' kw ', nhưng' func 'có thể có nhiều arg, như' a ',' b ',' c '.
Tôi chỉ muốn chơi với giá trị trả lại, mọi thứ khác sẽ vẫn còn, có thể không?
Cảm ơn!
Cập nhật Cuối cùng vấn đề này đã được giải quyết bằng decorator mô-đun và các bản vá sau:
--- /home/jaime/cache/decorator-3.2.0/src/decorator.py 2010-05-22 23:53:46.000000000 +0800
+++ decorator.py 2010-10-28 14:55:11.511140589 +0800
@@ -66,9 +66,12 @@
self.name = '_lambda_'
self.doc = func.__doc__
self.module = func.__module__
- if inspect.isfunction(func):
+ if inspect.isfunction(func) or inspect.ismethod(func):
argspec = inspect.getargspec(func)
self.args, self.varargs, self.keywords, self.defaults = argspec
+ if inspect.ismethod(func):
+ self.args = self.args[1:] # Remove the useless 'self' arg
+ argspec = inspect.ArgSpec(self.args, self.varargs, self.keywords, self.defaults)
for i, arg in enumerate(self.args):
setattr(self, 'arg%d' % i, arg)
self.signature = inspect.formatargspec(
vá này cho phép bạn để trang trí các phương pháp bị chặn, nó chỉ ném đầu tiên 'tự' lập luận đi, sử dụng decorator.decorator giữ nguyên, không tìm thấy hiệu ứng xấu ngay bây giờ.
mã ví dụ:
def __getattr__(self, attr):
def pformat_wrapper(f, *args, **kw):
data = f(*args, **kw)
return pprint.pformat(data, indent = 4)
method = getattr(self.ncapi, attr)
return decorator(pformat_wrapper, method) # Signature preserving decorating
[email protected]:~/bay/dragon.testing/tests$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import decorator
>>> class A:
... def f(self):
... pass
...
>>> a = A()
>>> a.f
<bound method A.f of <__main__.A instance at 0xb774a20c>>
>>> def hello(f, *args, **kw):
... print 'hello'
... return f(*args, **kw)
...
>>> f1 = decorator.decorator(hello, a.f)
>>> f1()
hello
>>>
Phương pháp này có quá tải không? – Tauquir
BTW Python không hỗ trợ quá tải phương thức. – Tauquir
Thay đổi các hàm của bạn để thay thế các giá trị có thể sử dụng bằng các chuỗi 'pprint.pformat' thực sự là một ý tưởng thực sự tồi (tm). Đừng. Do. Nó. –