- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
给定一个函数:
def func(f1, kw='default'):
pass
bare_argspec = inspect.getargspec(func)
@decorator
def func2(f1, kw='default'):
pass
decorated_argspec = inspect.getargspec(func2)
我如何创建一个装饰器使得 bare_argspec == decorated_argspec
?
(至于为什么,调用装饰函数的框架会进行 argspec 检查以选择要传入的内容,因此装饰器必须保留相同的 argspec 才能玩得很好。当我在 #python 上提出这个问题时,我有一篇关于为什么框架很糟糕的长篇演讲,这不是我想要的;我必须在这里解决问题。另外,我也只是对答案感兴趣)
最佳答案
Michele Simionato 的 decorator module有一个名为 decorator 的装饰器,它保留函数 argspecs。
import inspect
import decorator
def func(f1, kw='default'):
pass
bare_argspec = inspect.getargspec(func)
print(bare_argspec)
# ArgSpec(args=['f1', 'kw'], varargs=None, keywords=None, defaults=('default',))
@decorator.decorator
def mydecorator(func,*args,**kw):
result=func(*args,**kw)
return result
@mydecorator
def func2(f1, kw='default'):
pass
decorated_argspec = inspect.getargspec(func2)
print(decorated_argspec)
# ArgSpec(args=['f1', 'kw'], varargs=None, keywords=None, defaults=('default',))
assert(bare_argspec==decorated_argspec)
关于python - 如何以编程方式更改 python 装饰器中函数的 argspec?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3729378/
我正在玩 Python 可调用。基本上你可以定义一个 python 类并实现 __call__ 方法来使这个类的实例可调用。例如, class AwesomeFunction(object):
给定一个函数: def func(f1, kw='default'): pass bare_argspec = inspect.getargspec(func) @decorator def
import inspect class Test: def test(self, p, d={}): d.update(p) return d print inspect.get
与以下密切相关:How can I programmatically change the argspec of a function in a python decorator? 装饰器模块提供了制
我是一名优秀的程序员,十分优秀!