问题标签 [python-decorators]

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 投票
3 回答
137 浏览

python - 我想在一个类中装饰一个方法但不编辑 class.py -- 里面的细节

Twython 模块在内部使用 requests 模块。

我想包装/装饰请求的requests.post(*k, **kw)方法,以便 Twythonrequest.post(...)调用的所有内容都将被透明地装饰/包装,而不会干扰 Twython 模块。

如果我编辑了请求代码库,那将很容易,但我很好奇如何解决将装饰器添加到已定义的函数/方法的一般问题。

我该如何编写magic_wrapper_doodad()- 或一些替代代码 - 所以我可以像这样装饰代码?

0 投票
1 回答
1637 浏览

python - Python 装饰器添加类级变量

我有2个A类和B类:

我怎样才能使它B通过使用装饰器“继承” A的类级变量(在本例中为x )?有可能吗?期望的行为(如果可能的话),在装饰之后,B看起来像这样:


注意:如果有人想/需要知道我为什么要问这个问题,这只是为了让 SQLAlchemy 的具体表继承在代码中看起来更好,尽管我可以看到许多此类行为的用例。

0 投票
1 回答
495 浏览

python - 我怎么了?

我有装饰器的问题。我正在尝试使用可选参数编​​写自己的装饰器。

这就是它现在的完成方式:

代码看起来不错(对我来说),但是当我使用装饰器时,出现以下错误:

我究竟做错了什么?

0 投票
2 回答
1192 浏览

python - 装饰器和类方法

我无法理解为什么会发生以下情况。我有一个装饰器,它除了检查函数是否是方法之外什么都不做。我以为我已经了解 Python 中的方法是什么,但显然,情况并非如此:

现在,运行以下命令:

我希望这段代码能打印两次 True。

那么,像在 Adder2 中那样手动装饰函数并不完全等同于通过 @deco 函数进行装饰?

有人可以很高兴并解释为什么会发生这种情况吗?

0 投票
3 回答
1148 浏览

python - 修复处理 @property setter 装饰器的 pyflakes

Pyflakes 不能很好地处理以下代码:

使用使用 pyflakes 的 vim 和 syntastic 我得到以下错误:

所以我收到警告,@nodes.setter因为我重新定义了nodes.

由于此代码正确,如何禁用此无用警告?或者哪个 python 检查器正确处理了这段代码?

更新

我在重构代码时遇到了一些问题,因为属性和函数具有不同的继承行为。访问基类的属性是不同的。看:

所以我现在倾向于避免这种语法,而是使用适当的函数。

0 投票
4 回答
205 浏览

python - 有没有办法将装饰器应用于需要有关类的信息的 Python 方法?

当你装饰一个方法时,它还没有绑定到类,因此还没有im_class属性。我正在寻找一种方法来获取有关装饰器内的类的信息。我试过这个:

但它不打印任何东西。

我可以想象这样做:

但如果我能避免它,它会让我很开心。

0 投票
2 回答
130 浏览

python - 有没有办法在 Python 中函数的每一行上装饰/执行操作?

假设我有一个函数或方法在执行它所做的每个操作之前执行重复的操作,例如检查值,如下所示:

这些检查会重复进行,最终会浪费大量时间和键盘弹簧,尤其是在经常需要它们的时候。

如果您可以控制操作功能,例如,do_operation_N您可以使用检查布尔值的东西来装饰功能。

但是,如果您无法控制各个do_operation_N操作怎么办?如果,对于函数或方法中的每一行,我希望执行相同的检查,是否有某种方法可以“插入”它而不在每个操作行上明确写入?例如,是否有一些装饰魔法可以让我执行以下操作?

如果有办法实现这一点,我不在乎它是否使用装饰器;我只想用某种方式说“对于函数/方法 X 中的每一行,先做 Y”。

上面一个方法的“神奇”示例do_call是我所追求的简写,但它会遇到个别行的乱序执行的严重问题(例如,如果函数的第一行是变量赋值,它的其次是使用该变量,无序执行它们会导致问题)。

需要明确的是:外部控制函数执行的逐行顺序的能力不是我想要实现的:理想情况下,我只是实现一些以自然执行顺序执行操作的东西每次myfunc都做某事。如果“做某事”最终仅限于“调用函数或方法”(不包括赋值、if检查等),那很好。

0 投票
3 回答
130 浏览

python - 尝试编写“to_class”通用装饰器

假设我已经定义:

我希望用它来创建装饰器,将函数结果转换为给定类的对象。但是,这不起作用:

因为 test_func 将寻找 to_test_class 并且不会找到它。另一方面,在类定义之前将赋值给 to_test_class 也会失败,因为尚未定义 TestClass。

尝试将 @to_class(TestClass) 放在 test_func 的定义之上也会失败,因为该方法是在类之前构造的(如果我没记错的话)。

我发现的唯一解决方法是将 to_test_class 手动定义为装饰器,而不是从一般的“to_class”定义返回。

值得一提的是,这只是一个基本示例,但我希望将 to_class 用于许多应用程序,例如在将返回值“插入”到类的构造函数之前对其进行修改;我也希望将它用作其他类方法的装饰器。

我相信有些人认为“to_class”装饰器毫无意义;相反,可以在装饰方法中进行操作。不过,我觉得它很方便,并且有助于提高可读性。

最后,我想补充一点,20% 是出于实际原因,80% 是出于学习原因,因为我发现这是我对 Python 中的装饰器一般不完全理解的东西。

0 投票
1 回答
2644 浏览

python - 具有多个装饰器的芹菜任务不自动注册任务名称

我有一个看起来像这样的任务

我的基本任务看起来像这样

我遇到的问题是芹菜工人正在使用名称注册任务

当我从任务中删除 @my_custom_decorator 或者像这样为任务提供显式名称时,任务注册良好(即包+模块+函数)

这种行为是预期的吗?当我有多个装饰器但没有明确的任务名称时,我是否需要做一些事情以便在第一种情况下使用默认的自动注册名称注册我的任务?

谢谢,

0 投票
5 回答
1746 浏览

python - 如何避免定义一个变量来保存可能只需要一次的函数结果

通常,只有当函数返回的值满足条件时,我才需要使用该值,如以下构造:

我想通过避免使用新变量来使这段代码更简洁和可读tmp,类似于这种方式:

另一个例子可能是:

这将更简洁易读

是否有可能获得或实现这种编码风格?

跟进

在我看来,获得它的最佳方法是通过装饰器缓存最后返回的值,请参阅下面的答案。

终极和确定的解决方案

尽管这个问题没有投票,但似乎我并不是唯一一个要求这种语言特性的人,事实上最后 Python 3.8 引入了海象运算符,它正好解决了这个需求。使用 Python 3.8+,上面的代码可以很方便地编写为: