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

我可以在包装函数之前修补Python装饰器吗?

微生宝
2023-03-14
问题内容

我有一个带有装饰器的函数,我正在Python
Mock库的帮助下进行测试。我想mock.patch用一个仅调用函数的模拟“
bypass”装饰器代替真正的装饰器。

我不知道的是如何在真正的装饰器包装功能之前应用补丁。我在补丁目标上尝试了几种不同的变体,并对补丁和导入语句重新排序,但均未成功。有任何想法吗?


问题答案:

装饰器在函数定义时应用。对于大多数功能,这是模块加载时的时间。(在其他函数中定义的函数会在每次调用封闭函数时应用装饰器。)

因此,如果您想用猴子修补装饰器,您需要做的是:

  1. 导入包含它的模块
  2. 定义模拟装饰器功能
  3. 设置 例如 module.decorator = mymockdecorator
  4. 导入使用装饰器的模块,或在您自己的模块中使用它

如果包含装饰器的模块也包含使用该装饰器的功能,则在您看到它们时它们已经被装饰了,您可能就是SOL

自从我最初编写此代码以来,进行编辑以反映对Python的更改:如果装饰器使用functools.wraps()并且Python版本足够新,则可以使用__wrapped__属性来挖掘原始函数并重新装饰它,但这绝不是保证,并且您要替换的装饰器也可能不是唯一应用的装饰器。



 类似资料:
  • 问题内容: 举个例子: 我遇到的问题是,甚至在我调用要装饰的函数之前就调用了。 开始输出: 在这一点上,我什至没有调用过一个装饰过的函数。 我刚刚开始使用装饰器,所以也许我缺少了一些东西。 问题答案: 我相信python装饰器只是语法糖。 和…一样 如您所见,即使没有调用 bar 也将调用 foo 。这就是为什么您看到装饰器函数的输出的原因。对于您将装饰器应用到的每个函数,您的输出应只包含一行。

  • 我试图理解decorator是如何工作的,我想知道一个修饰过的函数是否可以访问decorator的变量。例如,在下面的代码中,如何使f1能够访问localVariable?这可能吗?这是一种很好的做事方式吗?

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

  • 问题内容: 我想这就是它们的称呼,但我会举一些例子以防万一。 装饰类: 装饰器功能: 使用一个或另一个只是口味的问题吗?有实际区别吗? 问题答案: 如果您可以编写函数来实现装饰器,则应首选它。但是并非所有装饰器都可以轻松地编写为一个函数-例如,当您要存储一些内部状态时。 我见过人们(包括我自己)经过荒唐的努力,只用函数编写装饰器。我仍然不知道为什么,一个班级的开销通常可以忽略不计。

  • 问题 你想在装饰器中给被包装函数增加额外的参数,但是不能影响这个函数现有的调用规则。 解决方案 可以使用关键字参数来给被包装函数增加额外参数。考虑下面的装饰器: from functools import wraps def optional_debug(func): @wraps(func) def wrapper(*args, debug=False, **kwargs):

  • 问题内容: 我正在尝试学习装饰器。我了解它的概念,现在尝试实现它。 这是我编写 的代码,代码不言自明。它只是检查参数是否传入。 抛出错误的说法。我了解它未在下定义,但不知道如何纠正此代码?我要去哪里错了? 问题答案: 您的装饰器应如下所示: 需要注意的几点: 期望将类作为第一个参数(您可以将其替换为简单的try / except TypeError除外)。 包装器应返回一个函数,而不是被调用函数的