Python 动态装饰器 - 为什么有这么多换行?

2024-01-03

所以我对 Python 装饰器还是有点陌生​​——我以前用过它们,但我从未制作过自己的装饰器。我正在阅读本教程 http://www.siafoo.net/article/68#run-time-tranformations(那个特定的段落)我似乎不明白为什么我们需要三个级别的功能?为什么我们不能做这样的事情:

def decorator(func, *args, **kwargs):
    return func(*args,**kwargs)

谢谢 :)


那么,如果您在函数上调用该装饰器会发生什么?

@decorator
def foo(): pass

这段代码会立即调用 foo,这是我们不希望的。调用装饰器,它们的返回值替换函数。就跟说的一样

def foo(): pass
foo = decorator(foo)

因此,如果我们有一个调用 foo 的装饰器,我们可能希望有一个函数返回一个调用 foo 的函数——它返回的函数将替换 foo。

def decorator(f):
    def g(*args, **kwargs):
        return f(*args, **kwargs)
    return g

现在,如果我们想将选项传递给装饰器,我们无法像您的示例中那样将它们与函数并排传递。它没有语法。所以我们定义一个返回参数化装饰器的函数。它返回的装饰器将是一个闭包。

def argument_decorator(will_I_call_f):
    def decorator(f):
        def g(*args, **kwargs):
            if will_I_call_f: return f(*args, **kwargs)
        return g
    return decorator

所以我们可以做

decorator = argument_decorator(True)
@decorator
def foo(): pass

Python 提供了方便的语法,您可以内联函数调用:

@argument_decorator(True)
def foo(): pass

所有这些都是非装饰器语法的语法糖

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

Python 动态装饰器 - 为什么有这么多换行? 的相关文章

随机推荐

  • 如何捕获无效的用户输入[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我不理解 Try throw catch 语句 并且想知道当代码中的所有 put 都应该是 int 时 捕获 char 的最佳方式是什么 这
  • TableView 单元格分隔线未延伸到整个单元格

    我正在开发一个新项目 并在 UI 中使用了故事板 我的所有 tableView 都存在行分隔符问题 下图显示了两条线 第一个是在属性检查器中设置的蓝色 第二个是黑色的 添加了我放置在单元格中的 imageView 该线确实延伸到单元格的右侧
  • 如何在 Java 中连接两个列表?

    有没有比以下更简单的方法 List
  • 无需分组即可获得最大值

    假设我有一张这样的表 name age a 1 b 2 c 3 d 4 e 5 f 6 通常 当我们选择 MAX age 时 它返回 f 6 元组 但我想要的是它应该按原样返回表 但所有年龄值都将是最大值 例如 name age a 6 b
  • 使用 Flyway 管理修补程序

    假设我有 2 个分支 Develop与迁移 V1 change1 V2 change2 V3 change3 V4 change4 V5 change5 Master迁移 部署在生产环境中 V1 change1 V2 change2 现在我
  • 如何在 jetpack compose 中显示具有适当大小/布局的垂直文本

    如何在 jetpack 中正确旋转文本并使其进行正确的布局 当我使用rotate文本对象上的修饰符会旋转文本 但布局中占用的大小似乎使用预旋转的文本宽度 这是我想要完成的一个简单示例 垂直文本应该位于狭窄空间的左侧 Composable f
  • 使用 groovy 将 ISO-8859-1 转换为 UTF-8

    我需要将 ISO 8859 1 文件转换为 utf 8 编码 而不丢失内容信息 我有一个如下所示的文件
  • 如何在 Python 中使用 AsciiDoc?

    最初的 AsciiDoc 处理器是用 python 编写的 但 AsciiDoc 演变为用 Ruby 编写的 Asciidoctor 形式 在我搜索如何处理现代 AsciiDoc Asciidoctor 方言 时 我只看到一篇文章 说有一个
  • 模块与命名空间 - 导入与需要 Typescript

    我很困惑module namespace export and import require reference用法 来自 Java 背景 有人可以简单地解释一下我何时使用什么以及什么是正确的设计 当我编写示例项目时 我觉得我搞砸了 到目前
  • XML 序列化类,具有隐藏继承成员的新属性

    我有以下抽象类结构 public abstract class Template Some properties and methods defined public abstract class Template
  • 在 bash 中将命令的输出拆分为关联数组

    输出是 ext4 boot ext2 tank zfs 每行的分隔符是一个空格 我需要一个关联数组 例如 gt ext4 boot gt ext2 tank gt zfs 这在 bash 中是如何完成的 如果命令输出在文件中file the
  • Xcode 6 gitignore 文件应包含哪些内容?

    典型的应该是什么 gitignore包含 Xcode 6 吗 另请参阅有关xccheckoutXcode 5 中引入参见here https stackoverflow com q 18340453 2158465 1 最简单的答案是我的看
  • 重新加载 JavaScript 文件而不刷新 HTML

    我有一个 HTML 它加载了几个 Javascript 文件 当我在浏览器控制台中调试 测试 Javascript 时 是否可以重新加载这些 Javascript 文件 而无需重新加载整个 HTML 页面 您可以删除然后重新添加它们 scr
  • 如何在 MS Access 的 SQL 中实现分页?

    我正在通过 ASP NET 访问 Microsoft Access 2002 数据库 MDB OdbcConnection类 尽管速度很慢 但效果很好 我的问题是关于如何在 SQL 中实现分页以查询该数据库 因为我知道我可以实现TOP子句为
  • 如何通过 Jenkins 脚本控制台设置“扫描组织触发器”?

    我需要一种通过 Jenkins 脚本控制台设置 扫描组织触发器 的方法 这很接近 但仅显示多分支或组织扫描触发器 如果它们已存在 https github com cloudbees jenkins scripts blob master
  • 在 Jetty 中从 http 重定向到 https

    我想从 http myurl 永久重定向到 https myurl 但在 Jetty 中我只找到 MovedContextHandler 用它我只能重定向上下文路径 例如从 myurl bla 到 myurl bla bla
  • 线程和执行器的正常关闭

    下面的代码试图实现这一点 该代码永远循环并检查是否有任何待处理的请求 如果有 它会创建一个新线程来处理请求并将其提交给执行器 所有线程完成后 它会休眠 60 秒 并再次检查待处理的请求 public static void main Str
  • 重写 Rust 中的总体特征实现

    对于我的游戏规则引擎 我有一个核心特征 称为Rule处理游戏回调 有两种类型Rules a BaseRule适用于游戏中的任何实体 并且CreatureRule仅适用于生物 我目前的代码结构如下 trait BaseRule
  • 具有多个倒计时器的 Recyclerview 导致闪烁

    我想显示我的每个细胞还剩下多少时间RecyclerView 为此 我为每个都使用了倒计时器 在每一行中我启动一个计数器并管理onTick 一切都按预期工作 我的每一行都有一个计时器滴答声 我的单元格也在更新 但我的单元格现在闪烁 当我滚动时
  • Python 动态装饰器 - 为什么有这么多换行?

    所以我对 Python 装饰器还是有点陌生 我以前用过它们 但我从未制作过自己的装饰器 我正在阅读本教程 http www siafoo net article 68 run time tranformations 那个特定的段落 我似乎不