问题标签 [decorator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
411 浏览

python - 如何将所有参数传递给装饰器?

我尝试使用装饰器跟踪某些方法的执行。这是装饰器代码:

问题是,如果我尝试将此装饰器应用于方法,则不会发送 self 参数。你能告诉我为什么,我该如何解决?

0 投票
3 回答
6595 浏览

python - 如何在装饰器中使用命名参数?

如果我有以下功能:

我希望仅在arg1为 20 时才触发拦截。我希望能够将命名参数传递给函数。我怎么能做到这一点?

这是一个小代码示例:

这会引发以下异常 TypeError: intercept() got an unexpected keyword argument 'a'

0 投票
7 回答
16000 浏览

python - 是否可以在运行时替换 Python 函数/方法装饰器?

如果我有一个功能:

是否可以在运行时替换装饰器?

0 投票
1 回答
206 浏览

python - 在 Python 中,是否可以访问包含方法的类,只给定一个方法对象?

我对 Python 很陌生,并且无法通过在线搜索找到这个问题的答案。

这是一个什么都不做的示例装饰器(还)

这是一个示例类

在我的装饰器中,我想访问类对象MyClass并将“sometext”添加到MyClass.my_var列表中。我的目标是在模块加载时用修饰值填充 my_var,而不是函数调用时。

有没有办法我可以导航到来f做到MyClass这一点?我知道 *args[0] 是 MyClass 的实例,但这仅在调用函数时可用。

0 投票
14 回答
22841 浏览

python - 如何创建一个可以使用或不使用参数的装饰器?

我想创建一个可以与参数一起使用的 Python 装饰器:

或没有它们(例如,默认将输出重定向到 stderr):

这有可能吗?

请注意,我不是在寻找重定向输出问题的不同解决方案,它只是我想要实现的语法示例。

0 投票
2 回答
456 浏览

python - 一个简单的冻结行为装饰器

我正在尝试为 Python 编写一个冻结装饰器。

思路如下:

(针对两条评论)

我可能错了,但我认为测试用例有两个主要用途。

  • 一种是测试驱动开发:理想情况下,开发人员在编写代码之前先编写案例。它通常有助于定义架构,因为该规则强制在开发之前定义真实的接口。人们甚至可能会认为,在某些情况下,在开发人员之间分配工作的人正在编写测试用例并用它来有效地说明他所考虑的规范。我没有任何使用这种测试用例的经验。

  • 第二个想法是,所有规模不错的项目和几个程序员都遭受代码损坏的困扰。以前可以正常工作的东西可能会因为看起来像无辜重构的变化而被破坏。虽然架构不错,但组件之间的松散耦合可能有助于对抗这种现象;如果您编写了一些测试用例以确保没有任何东西会破坏程序的行为,那么您晚上会睡得更好。

然而,没有人可以否认编写测试用例的开销。在第一种情况下,人们可能会争辩说测试用例实际上是在指导开发,因此不应被视为开销。

坦率地说,我是一个非常年轻的程序员,如果我是你,我在这个主题上的话并不真正有价值......无论如何,我认为大多数公司/项目都不是这样工作的,并且主要使用单元测试在第二种情况下...

换句话说,它的目的不是确保程序正常工作,而是检查它将来是否会正常工作。

通过使用这种冻结装饰器,无需编写测试成本即可满足此需求。

假设你有一个函数

它非常好,您想将其重写为优化版本。这是一个大项目的一部分。您希望它为几个值返回相同的结果。与其经历测试用例的痛苦,不如使用某种冻结装饰器。

第一次运行装饰器时,装饰器使用定义的 args(低于 0 和 7)运行函数并将结果保存在映射中( f --> args --> result )

下次执行程序时,装饰器将加载此映射并检查此函数对这些 args 的结果是否未更改。

我已经很快写了装饰器(见下文),但伤害了一些我需要你建议的问题......

  • 结果的转储和比较对于所有类型来说都不是微不足道的。现在我正在考虑使用一个函数(我在这里称之为后处理)来解决这个问题。基本上,我不是存储 res,而是存储 postprocess(res),然后比较 postprocess(res1)==postprocess(res2),而不是比较 res1 res2。让用户重载预定义的后处理函数很重要。我的第一个问题是: 你知道检查对象是否可转储的方法吗?

  • 为修饰的函数定义一个键是一件痛苦的事情。在以下片段中,我使用了功能模块及其名称。** 你能想出一个更聪明的方法来做到这一点。**

  • 下面的片段有点工作,但在测试和录制时打开和关闭文件。这只是一个愚蠢的原型......但是你知道打开文件,处理所有功能的装饰器,关闭文件的好方法......

  • 我打算为此添加一些功能。例如,添加定义一个可迭代对象以浏览一组参数、记录实际使用的参数等的可能性。您为什么期望这样的装饰器?

  • 一般来说,你会使用这样的功能,知道它的局限性......尤其是在尝试将它与 POO 一起使用时?

0 投票
3 回答
651 浏览

python - Python:装饰器特定参数(与包装函数无关)?

我正在寻找一个缓存装饰器,它给定一个函数将函数的结果缓存到装饰中指定的位置。像这样的东西:

装饰器的参数与它包装的函数的参数完全分开。我已经看过很多例子,但我不太明白如何做到这一点 - 是否有可能为装饰器提供一个与包装函数无关且未传递给包装函数的参数?

0 投票
3 回答
21035 浏览

python - Python 中的装饰器类

我想构建用作装饰器的类,并保持以下原则:

  1. 应该可以在 1 个函数的顶部堆叠多个此类装饰器。
  2. 生成的函数名称指针应该与没有装饰器的同一个函数无法区分,可能只是针对它的类型/类。
  3. 除非装饰器实际要求,否则订购装饰器不应该是相关的。IE。可以按任何顺序应用独立的装饰器。

这是针对 Django 项目的,我现在正在处理的具体情况是该方法需要 2 个装饰器,并显示为普通的 python 函数:

@AutoTemplate 更改了函数,因此它不返回 HttpResponse,而是返回一个字典以在上下文中使用。使用了 RequestContext,模板名是从方法名和模块中推断出来的。

@AccessCheck 根据 item_id 添加对用户的额外检查。

我猜这只是为了让构造函数正确并复制适当的属性,但是这些是哪些属性?

下面的装饰器不会像我描述的那样工作:

如以下代码所示:

此外,尝试在 NullDecl 构造函数中添加“print func.name ”,它将适用于第一个装饰器,但不适用于第二个 - 因为 name 将丢失。

完善eduffy的答案,它似乎工作得很好:

0 投票
3 回答
2971 浏览

decorator - 在 ASP.NET 中装饰方法?

又是我……我在我读过/看过的教程中经常听到“装饰/装饰”这个方法。但我就是不明白这意味着什么以及它实际上做了什么?谁能指出我开始使用它们的一些信息的方向(非常新手教程会很好)

0 投票
8 回答
139272 浏览

python - 如何装饰班级?

在 Python 2.5 中,有没有办法创建装饰类的装饰器?具体来说,我想使用装饰器将成员添加到类并更改构造函数以获取该成员的值。

寻找类似以下的内容(在 'class Foo:' 上有语法错误:

我想我真正追求的是一种在 Python 中执行类似 C# 接口的方法。我想我需要改变我的范式。