当前位置: 首页 > 面试题库 >

如何在python装饰器中以编程方式更改函数的argspec?

丁书
2023-03-14
问题内容

给定一个功能:

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的装饰器,该装饰器保留了功能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装饰器的函数式编程详解的使用技巧和注意事项,需要的朋友参考一下 Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西。虽然好像,他们要干的事都很相似——都是想要对一个已有的模块做一些“修饰工作”,所谓修饰工作就

  • 我们知道,在 Python 中,我们可以像使用变量一样使用函数: 函数可以被赋值给其他变量 函数可以被删除 可以在函数里面再定义函数 函数可以作为参数传递给另外一个函数 函数可以作为另一个函数的返回 简而言之,函数就是一个对象。 对一个简单的函数进行装饰 为了更好地理解装饰器,我们先从一个简单的例子开始,假设有下面的函数: def hello(): return 'hello world'

  • 主要内容:带参数的函数装饰器,函数装饰器可以嵌套前面章节中,我们已经讲解了 Python 内置的 3 种函数装饰器,分别是 @staticmethod、@classmethod 和 @property,其中 staticmethod()、classmethod() 和 property() 都是 Python 的内置函数。 那么,函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示: 实际上,上面

  • 问题内容: 假设我有以下几点: 我想测试该功能,而无需经历建立连接的麻烦(或装饰者所做的任何事情)。 给定,我如何从中剥离装饰器并获得基础的“未装饰”功能? 问题答案: 在一般情况下,您不能这样做,因为 相当于 这意味着“原始”垃圾邮件甚至可能不再存在。一个(不太漂亮的)hack是这样的:

  • 我在我的应用程序中成功实现了一个带有NavigationView的“侧菜单”,并按照本教程中的说明创建了一个自定义操作栏。看起来是这样的: 太好了,很有效。。。它通过ActionBar中的“hamburger”按钮和从左到右滑动手指打开;我可以为这些选项附加功能。但是,我想通过Java以友好的方式更改选项标题。关于这一点,我找到了其他一些StackOverflow问题,并尝试在答案中实现解决方案。

  • 问题内容: 我目前正在开发一个用于eclipse的插件,该插件可以分析Eclipse Workspace中项目之间的依赖关系和引用,并在其自己的类似UML的视图中显示它们。 为了提高插件的实用性,我希望通过允许用户在包浏览器中打开一个项目,并在适用的情况下,通过单击显示的图在编辑器中打开该项目,来向该图添加交互性。 但是,我的问题是,尽管我知道如何从程序包浏览器中获取给定的选择,但我仍无法找到一种