def foo(a, b, c = 0):
return a+b
Tengo docenas de funciones como 'foo', que tienen diferentes números de argumento y nombres. ¿Existe una forma común de obtener los valores de retorno de estas funciones y hacer solo una operación adicional como pformat?¿Es posible modificar el valor de retorno de una función sin definir una nueva función en python?
Sí puedo simplemente generar una nueva función como la siguiente:
func = ... # func can be got using getattr by name
def wrapper(*arg, **kw):
data = func(*arg, **kw)
return pprint.pformat(data)
return wrapper
Pero entonces la nueva función 'envoltorio' es diferente a la antigua 'func', por ejemplo, en número de argumento, 'envoltorio 'tiene solo 2 args -' arg 'y' kw ', pero' func 'puede tener muchas args, como' a ',' b ',' c '.
Solo quiero jugar con el valor de retorno, todo lo demás debe permanecer quieto, ¿es posible?
Gracias!
actualización Por último, este problema se resuelve utilizando decorator módulo y el siguiente parche:
--- /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(
Este parche permite decorar métodos acotadas, simplemente lanza el primer argumento 'auto' de distancia, el uso de decorator.decorator se mantiene igual, no se encontraron malos efectos en este momento.
código de ejemplo:
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
>>>
¿Es la sobrecarga de métodos? – Tauquir
BTW Python no es compatible con la sobrecarga de métodos. – Tauquir
Cambiar sus funciones para reemplazar valores utilizables con cadenas 'pprint.pformat' es realmente una idea realmente mala (tm). No lo hagas Hacer. Eso. –