python怎么返回进行修改_是否可以修改函数的返回值而无需在python中定义新函数?...

def foo(a, b, c = 0):

return a+b

我有很多像’foo’这样的函数,它们都有不同的参数编号和名称.有没有一种常见的方法可以获得这些函数的返回值,并只对它们执行一个额外的操作,如pformat?

是的我可以生成如下的新功能:

func = ... # func can be got using getattr by name

def wrapper(*arg, **kw):

data = func(*arg, **kw)

return pprint.pformat(data)

return wrapper

但是新函数’wrapper’与旧的’func’不同,例如,在参数编号中,’wrapper’只有2个args – ‘arg’和’kw’,但’func’可能有很多args ,像’a’,’b’,’c’.

我只想玩返回值,其他一切应该保持不变,是否可能?

谢谢!

更新

最后使用decorator模块和以下补丁解决了这个问题:

--- /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(

这个补丁允许你装饰有界方法,它只是抛出第一个“自我”参数,decorator.decorator的使用保持不变,现在没有发现任何不良影响.

示例代码:

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

jaime@westeros:~/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

>

>>> def hello(f, *args, **kw):

... print 'hello'

... return f(*args, **kw)

...

>>> f1 = decorator.decorator(hello, a.f)

>>> f1()

hello

>>>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值