带参数的装饰器[重复]

2024-02-14

代码如下

def my_dec(func):
    def wrap(w):
        t = func(w)
        return t * 4
    return wrap


@my_dec
def testing(n):
    return n


new = testing(3)
print(new)  # This prints 12

这个例子工作正常,但现在我尝试将以下内容添加到装饰器中@my_dec(100),我需要将给定的数字乘以 100。

当我尝试这个时

@my_dec(100)
def testing(n):
    return n

我收到以下错误:

Traceback (most recent call last):
  File "./deco2", line 10, in <module>
    @my_dec(100)
  File "./deco2", line 5, in wrap
    t = func(w)
TypeError: 'int' object is not callable

我怎样才能通过100给装饰者?


在第一个示例中,您正确地将装饰器定义为一个函数,该函数接受包装的函数并返回一个新函数。

要添加参数,您需要编写一个接受参数的函数,并且返回装饰器,即返回接受包装函数并返回一个函数的函数。

一种方法是:

def my_dec(x):
    def dec(func):
        def wrap(w):
            t = func(w)
            return t * x
        return wrap
    return dec

如果您考虑一下什么,这可能会稍微清楚一些@语法扩展为:

@my_dec(100)
def testing(n):
    return n

扩展到:

def testing(n):
    return n
testing = my_dec(100)(testing)

此外,为了减少高嵌套级别并使装饰器更具可读性和可维护性,您可以定义一个装饰器类,该类在其__init__,并在其中调用包装函数__call__。网上有很多例子。你可以从阅读开始这个问题 https://stackoverflow.com/q/666216/2096752.

还有一些方法可以让您的装饰器采用可选参数(即,以便您的两个示例都有效)。


如果你真的想深入了解装饰器,请阅读格雷厄姆·邓普尔顿的博客 https://github.com/GrahamDumpleton/wrapt/tree/master/blog。强烈推荐。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带参数的装饰器[重复] 的相关文章

随机推荐

  • 如何将 char 数组定义为常量?

    这里是 C C 菜鸟 我已经在头文件中定义了它 typedef unsigned char BitChar 9 8 data bytes chars and one width byte char extern BitChar BitFon
  • 使用 XCode 增加堆栈大小

    我在Linux上开发了一个命令行应用程序 需要增加其堆栈 在 Linux 上我只是使用了解决方法 ulimit s unlimited在运行程序之前 在 Mac OS X 上 使用 G 命令行 我添加到编译选项 Wl stack size
  • 使用代码清理时在 Resharper 中禁用/自定义注释(重新)格式化

    有没有办法定义如何使用 Resharper 6 清理 注释 我没有找到解决这个问题的方法 代码清理之前
  • 为什么 IntelliSense 无法将我的查询所选项目识别为元素?

    Problem 我试图弄清楚为什么当我使用以下命令访问 HTML 元素时 VSCode 的 IntelliSense 不会建议元素对象属性 document querySelector 每当我使用document querySelector
  • 重试 Javascript.Promise.reject 有限次数或直到成功

    我有一个函数说myMainFunction从客户端调用 然后调用mypromisified功能 设想 mypromisified函数可能会间歇性失败 我需要延迟 以指数增长 调用此函数 直到成功或达到最大尝试次数 到目前为止我所拥有的 以下
  • icmp 端口不可达错误消息

    我正在将 UDP 数据包从一台 PC 发送到另一台 PC 我正在使用 Wire Shark 观看整个活动 我注意到有一段时间数据包从一个系统到另一个系统的传输很顺利 然后突然间ICMP有错误的数据包 port unreachable 开始出
  • Bash 脚本中的这一行是如何工作的?

    我试图弄清楚顶部的某一行代码是如何BASH 手册页选项卡补全脚本 https github com scop bash completion blob 52315ef2ceb3f8e6b7fe45a09f8df24b73394da4 com
  • 是否可以通过 GitHub 的 Web 界面恢复提交

    我正在 Chromebook 上教授 HTML 课程 我们使用 GitHub 进行修订控制 我想向我的学生展示如何恢复提交 由于我们在 Chromebook 上没有 shell 访问权限 因此我希望通过 GitHub 网站找到一种在线执行此
  • Laravel 5.2 - pluck() 方法返回数组

    我正在尝试升级我的项目 L5 1 gt L5 2 在升级指南 http laravel com docs 5 2 upgrade upgrade 5 2 0有一件事我不清楚 The listsCollection 上的方法 查询生成器和 E
  • 如何使用 datetime.time 绘图

    我有 HH MM SS 格式的时间戳列表 并希望使用 datetime time 绘制某些值 看来 python 不喜欢我这样做的方式 有人可以帮忙吗 import datetime import matplotlib pyplot as
  • 我如何告诉 Masonry 组件它的单元格已经改变了高度?

    我有一个反应组件 它以网格模式显示一维项目列表 每个项目都具有相同的宽度和高度 并且它们位于三列内 可能有很多这样的东西 所以我决定使用 Masonry 组件来尝试一下 React virtualized 该组件似乎是专门为这个用例而编写的
  • 如何在 C# 中创建 X509Certificate2 时更改颁发者名称

    我正在我的 C net 应用程序中创建 X509Certificate2 证书 创建证书时 如何设置颁发者名称 目前发行人名称与主体名称相同 请帮忙 Hmm 终于我用了充气城堡 dll创建证书 使用它 有一种方法可以设置颁发者名称 这是要生
  • --ntasks 或 -ntasks 在 SLURM 中起什么作用?

    我正在使用SLURM http slurm schedmd com 使用一些计算集群 它有 ntasks or n 我显然已经阅读了它的文档 http slurm schedmd com sbatch html http slurm sch
  • 为什么清空 NavigationStack 路径后对象仍在内存中?

    我正在尝试实现一个协调器来管理流程 状态存储在 CoordinatorStore 内 有 2 个用于管理流程的 Published 属性 这screen属性控制当前显示哪个视图以及path控制堆栈视图的导航堆栈 实施细节可以在下面找到 根据
  • grunt-contrib-jshint 忽略没有效果

    我想排除libs目录免于被检查 然而 ignores in options并种植了 jshintignore项目目录中的文件不会生成libs被排除在外 jshint options smarttabs true ignores public
  • 让 Sphinx 替换文档字符串文本

    我正在 Sphinx 中记录类似于以下内容的代码 class ParentClass object def init self pass def generic fun self Call this function using run P
  • Zend框架中的内连接

    我想在两个表之间进行内连接 访问表有 访问id target 报告表有 rep id visit id 每次访问都有很多报告 我想选择所有指定访问目标的报告 我这样做但它不起作用 db Zend Db Table getDefaultAda
  • Mercurial 显示文件修改不正确

    当我克隆 Mercurial 存储库时 它通常会显示文件已被修改 而实际上尚未修改 当我执行以下步骤时可能会发生这种情况 hg clone
  • 片段中的列表视图不起作用

    这是我的片段代码 public class LeftFragment extends ListFragment ArrayList
  • 带参数的装饰器[重复]

    这个问题在这里已经有答案了 代码如下 def my dec func def wrap w t func w return t 4 return wrap my dec def testing n return n new testing