问题标签 [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 投票
1 回答
966 浏览

python - 用方法装饰函数(带有任意参数)

参考

在写这个问题之前,我已经参考了以下一些有趣的问题,并且觉得这个场景没有被解释/覆盖:

我有一个function如下:

而且,我有以下class一些methods

我正在使用Test_method_1simple_function如下:

假设如果simple_function接受任意参数,则Test_method_1调用如下:

现在,我想Test_method_2用作decorator version. Test_method_1所以simple_function定义可以写成如下:

注意:Test_method_2Test_method_1使用适当的参数调用。

现在的问题:

  • 1 - 这可能吗?
  • 2 - 如果可能,如何将装饰函数的名称(此处simple_function)作为参数传递给Test_method_2(包括self)?
  • 3 - [这是杀手问题,我相信] 我想将任意参数传递给Test_method_2(装饰器)和 simple_function(被装饰的函数) - *args and **kwargs- 应该如何Test_method_2定义接收参数(包括self)?

Test_method_2作为带有任意参数的装饰器的用法simple_function如下:

0 投票
3 回答
7098 浏览

python - 在编译时提供函数元数据的大多数 Pythonic 方式?

我正在以 Python 2.7 模块的形式构建一个非常基本的平台。这个模块有一个 read-eval-print 循环,输入的用户命令被映射到函数调用。因为我试图让为我的平台构建插件模块变得容易,所以函数调用将从我的主模块到任意插件模块。我希望插件构建器能够指定他想要触发他的函数的命令,所以我一直在寻找一种 Pythonic 方式来远程输入 Main 模块中的 command->function dict 中的映射。插件模块。

我看过几件事:

  1. 方法名解析:主模块将导入插件模块并扫描它以查找匹配特定格式的方法名。例如,它可能会将 download_file_command(file) 方法添加到其字典中作为“下载文件”-> download_file_command。但是,要获得一个简洁、易于键入的命令名称(例如,“dl”)要求函数名称也很短,这不利于代码的可读性。它还要求插件开发人员符合精确的命名格式。

  2. 跨模块装饰器:装饰器可以让插件开发人员随意命名他的函数,并简单地添加类似 @Main.register("dl") 的东西,但它们必然要求我修改另一个模块的命名空间并保持全局状态在主模块。我明白这是非常糟糕的。

  3. 同模块装饰器:使用与上面相同的逻辑,我可以添加一个装饰器,将函数名称添加到插件模块本地的某个命令名称->函数映射,并通过 API 调用检索到主模块的映射。这要求某些方法始终存在或继承,并且 - 如果我对装饰器的理解是正确的 - 该函数只会在第一次运行时注册自己,并且此后每次都不必要地重新注册自己。

因此,我真正需要的是一种 Pythonic 方式来使用应该触发它的命令名称来注释函数,并且这种方式不能是函数的名称。当我导入模块时,我需要能够提取命令名称-> 函数映射,并且插件开发人员方面的工作量减少是一大优势。

感谢您的帮助,如果我对 Python 的理解有任何缺陷,我深表歉意;我对这门语言比较陌生。

0 投票
2 回答
2371 浏览

python - 访问原始装饰函数以进行测试

我在视图函数中使用装饰器(@render_to来自包)。django_annoying

但问题是我想获取视图函数返回的原始 dict 用于测试目的,而不是HttpResponse装饰器返回的对象。

装饰器使用@wraps(from functools)。

如果无法访问它,那么您是否知道如何测试它?

0 投票
1 回答
10238 浏览

python - Numpy 矢量化作为带有参数的装饰器

我试图矢量化(同意,不是最有效的方法,但我的问题是关于装饰器的使用)以下函数

编辑:重新启动 IPython 后,输出正常。

任何人都可以解释为什么即使第一个参数 x 在这里是 aray of的结果diff_if_bigger被转换成一个数组,与文档中的内容相反????np.intnp.float

现在,我想强制浮点输出,所以我这样做了

顺便说一句,即使这个

不工作!!!发生什么了??

编辑:事实上,后者在我重新启动 IPython 后工作。

所以在我之前的两次编辑之后,我的问题现在是双重的:

1-如何使用 np.vectorize 作为带参数的装饰器?

2-如何清理 IPython 状态?

0 投票
0 回答
2786 浏览

django - 用于自定义权限的 Django 自定义装饰器

有一个Project模型与模型具有多对多关系User,使用连接表。如果用户不是项目的成员(不在连接表中),我想阻止用户访问显示特定项目的视图。

我知道它可以通过视图方法中的简单 if 语句或模板中的自定义过滤器来解决,但我希望能够使用自定义装饰器来做到这一点。这可能吗?如果是这样怎么做?

就像是:

如何访问从装饰器函数page_id发送到的参数?my_view

0 投票
1 回答
252 浏览

python - 适用于类方法和实例方法的装饰器

我有两个装饰器,定义如下,它们都做同样的事情:

我有两个的原因是因为对于类方法我需要将第一个 arg 作为 cls=cls 传递,例如方法我需要传递 self=self。但这显然并不理想。有谁知道构造一个适用于实例方法和类方法的装饰器的方法?

0 投票
2 回答
1750 浏览

python - 创建一个类级别的装饰器来自动添加一个属性

我想创建一个类级别的装饰器,它会自动将属性添加到对象,包括适当的 getter 和 setter 方法以及支持变量。例如:

我经常发现自己创建了许多“半复杂”的 getter/setter(它们可以只用一个简单的属性来完成,但它们需要默认值和 null 保护。我希望能够指定一个能够完成繁重工作的装饰器在类的新实例上创建属性。

如果我在这种方法上偏离了基础,我对同样可行的方法持开放态度。

任何帮助,将不胜感激。

我正在使用 python 3.X 和 python 2.7,所以在任何一个中都可以使用的东西是首选但不是必需的。

更新:我在我正在寻找的东西中添加了更多种类。一般来说,我需要能够创建很多这些简单的自动属性(ala C# auto-property,但具有更多的灵活性)。我不一定要公开后备存储,但我确实想确保对实例化对象(不一定是类)的检查显示已创建的属性。

0 投票
1 回答
2036 浏览

python - python 装饰器参数

python装饰器函数是否支持参数a如何实现

运行时出现此错误

我试过 @decorator(arg) 或 @decorator arg 。它也不起作用。到目前为止,我想知道这是否可能

0 投票
10 回答
45641 浏览

python - 如何使用 Python 装饰器检查函数参数?

我想在调用某些函数之前定义一些通用装饰器来检查参数。

就像是:

旁注:

  1. 类型检查只是在这里展示一个例子
  2. 我正在使用 Python 2.7,但 Python 3.0 也应该很有趣

编辑 2021:有趣的是,从长远来看,类型检查并没有使用类型提示mypy 反python

0 投票
1 回答
130 浏览

python - @login_required() 不重定向已注销的用户

未登录的用户被@login_required()装饰器重定向到LOGIN_URL指定的settings.py. 到现在为止还挺好。但我不想那样。我不想重定向它们,而是想向未登录的人显示错误消息。

我认为这可能有效,但我得到了一个TypeError: ios_login_required() takes exactly 1 argument (0 given)我不明白的。是装饰器,需要什么参数?

带有装饰器的视图可能如下所示:

有什么想法我哪里出错了吗?