更改签名的修饰符:正确记录附加参数

维京格

假设我有一个自定义装饰器,并且我希望它能够正确处理装饰函数的文档字符串。问题是:我的装饰器添加了一个参数。

from functools import wraps

def custom_decorator(f):
    @wraps(f)
    def wrapper(arg, need_to_do_more):
        '''
        :param need_to_do_more: if True: do more
        '''
        args = do_something(arg)

        if need_to_do_more:
            args = do_more(args)

        return f(args)

    return wrapper

您可以看到该参数实际上并没有传递给装饰函数,而是由包装器使用的-在这里可能相关,也可能不相关。

如何正确记录附加参数?包装器接受其他参数是一个好习惯,还是应该避免呢?

还是我应该使用其他解决方案,例如:

  • 使包装器成为简单的高阶函数,并将其调用的函数作为第三个参数传递
  • 重构包装成两个独立的功能?
雅各布·齐默曼

如果期望装饰的结果总是向该参数提供相同的内容,则建议将其设置为参数化装饰器。我猜您已经想到了这一点,但是需要说一下。

除此之外,我肯定会建议将其分成两部分,就像您的第二个建议一样。然后,装饰器的用户可以提供使用两个不同装饰器的“重载”版本(因为它们将需要不同的名称,因此不是真正的重载)。

另一个可能的选项是为参数提供默认值。

最后,如果只是必须保持原样,则需要在包装器定义__doc__ 之后末尾附加新的参数文档

因此,您的示例(简化)如下所示:

def custom_decorator(f):
    @wraps(f)
    def wrapper(arg, need_to_do_more):
        ...

    wrapper.__doc__ += "/n:param need_to_do_more: if True: do more"
    return wrapper

这是因为@wraps(f)装饰器将wrapper的文档替换为f之后添加它实际上将两者结合在一起。

这些选项的另一种选择是进行文档记录,custom_decorator以便说包装方法需要在其文档中添加参数。这以及装饰器的拆分给用户带来了负担,但它们使意图更加明确(“ ...显式优于隐式...”-Python Zen)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

参数的非法修饰符

来自分类Dev

我可以将Caps Lock更改为超级/附加修饰符吗?

来自分类Dev

AtTask修饰符

来自分类Dev

使用EnableDelayedExpansion时,变量修饰符的语法正确

来自分类Dev

在Java中开发通用修饰符的正确方法

来自分类Dev

使用引用参数的构造函数的显式修饰符

来自分类Dev

使用Python的重试修饰符的动态参数

来自分类Dev

在运行时更改访问修饰符

来自分类Dev

嵌套类的C#更改方法修饰符

来自分类Dev

DataTemplateSelector错误:无法更改访问修饰符

来自分类Dev

如何更改CodeMaid添加的默认访问修饰符

来自分类Dev

关于修饰符的记忆

来自分类Dev

日期修饰符说明

来自分类Dev

使用Smarty修饰符

来自分类Dev

常量修饰符被忽略

来自分类Dev

关于修饰符的记忆

来自分类Dev

Eclipse在接口方法签名中生成无用的“公共抽象”修饰符

来自分类Dev

访问修饰符是C#中“方法签名”的一部分吗?

来自分类Dev

使用C中的宏删除(或有条件地附加)const修饰符

来自分类Dev

如何使用参数中的不匹配引用修饰符动态播送可变参数模板?

来自分类Dev

用可见性修饰符覆盖接口成员函数的正确语法是什么?

来自分类Dev

如何在TypeScript中使用修饰符正确包装构造函数

来自分类Dev

带有 M 修饰符的 %SCAN 给出不正确的结果

来自分类Dev

ByRef和Output方法参数修饰符有什么区别?

来自分类Dev

为什么方法将类名用作修饰符(?)和参数?

来自分类Dev

在渲染的伪图案内使用样式修饰符和图案参数

来自分类Dev

将C#7.2'in'参数修饰符无处不在是否有用

来自分类Dev

如何在参数和返回类型上使用匹配的const修饰符编写函数?

来自分类Dev

将“ m”修饰符添加到作为参数传递的二维模式

Related 相关文章

  1. 1

    参数的非法修饰符

  2. 2

    我可以将Caps Lock更改为超级/附加修饰符吗?

  3. 3

    AtTask修饰符

  4. 4

    使用EnableDelayedExpansion时,变量修饰符的语法正确

  5. 5

    在Java中开发通用修饰符的正确方法

  6. 6

    使用引用参数的构造函数的显式修饰符

  7. 7

    使用Python的重试修饰符的动态参数

  8. 8

    在运行时更改访问修饰符

  9. 9

    嵌套类的C#更改方法修饰符

  10. 10

    DataTemplateSelector错误:无法更改访问修饰符

  11. 11

    如何更改CodeMaid添加的默认访问修饰符

  12. 12

    关于修饰符的记忆

  13. 13

    日期修饰符说明

  14. 14

    使用Smarty修饰符

  15. 15

    常量修饰符被忽略

  16. 16

    关于修饰符的记忆

  17. 17

    Eclipse在接口方法签名中生成无用的“公共抽象”修饰符

  18. 18

    访问修饰符是C#中“方法签名”的一部分吗?

  19. 19

    使用C中的宏删除(或有条件地附加)const修饰符

  20. 20

    如何使用参数中的不匹配引用修饰符动态播送可变参数模板?

  21. 21

    用可见性修饰符覆盖接口成员函数的正确语法是什么?

  22. 22

    如何在TypeScript中使用修饰符正确包装构造函数

  23. 23

    带有 M 修饰符的 %SCAN 给出不正确的结果

  24. 24

    ByRef和Output方法参数修饰符有什么区别?

  25. 25

    为什么方法将类名用作修饰符(?)和参数?

  26. 26

    在渲染的伪图案内使用样式修饰符和图案参数

  27. 27

    将C#7.2'in'参数修饰符无处不在是否有用

  28. 28

    如何在参数和返回类型上使用匹配的const修饰符编写函数?

  29. 29

    将“ m”修饰符添加到作为参数传递的二维模式

热门标签

归档