【问题标题】:python : is decorators for method arguments possible?python:方法参数的装饰器可能吗?
【发布时间】:2011-09-01 14:58:57
【问题描述】:

是否可以装饰方法参数?比如:

class SampleEntity (BaseEntity) :
    def someOperation (self, @Param(type="int", unit="MB")i, str) :
        pass

基本上,我希望开发人员能够指定关于类、属性、方法、参数等的元数据,我稍后可以处理这些元数据。对于类和方法,我可以使用装饰器。所以我想知道如何为方法参数做这件事。

谢谢, 小

【问题讨论】:

  • 什么样的元数据?你不能为此使用文档字符串吗?

标签: python methods arguments decorator


【解决方案1】:

您可以用注释记录function definition。注释的实际含义取决于您和使用您的函数的代码。

例如:

def dostuff(f: str, x: "Hula hula!"):
     pass

【讨论】:

  • 有趣。我没有意识到这一点。 +1
【解决方案2】:

不,但在 Python 3 中,您可以使用 annotations

def func(arg: Param(type = 'int', unit = 'MB')):
   pass

注释可以包含您想要的任何信息,语言并没有定义应该去哪里。您可以稍后使用func.__annotations__ dict 访问它们。

【讨论】:

  • 谢谢!有趣的是,PEP - python.org/dev/peps/pep-3107 - 说该属性称为 func_annotations,而不是 __annotations__。是不是已经过时了? PEP 会过时吗? :)。我得到一个 AttributeError 并且无法理解我做错了什么。
  • @letitbee:我认为您应该默认首先检查语言参考,然后再查看 PEP,至少对于已经实现的语言功能。即使在 3.0 中,注释也存储在 __annotations__ 中,所以我猜他们已经决定在发布 PEP 和实施它之间的某个时间对其进行更改。
  • 实际上,我引用了 PEP-1,“PEP 应该提供功能的简明技术规范<...>”。虽然如果你是对的,我们不能信任 PEP,我们也不能信任 PEP-1! ;)
【解决方案3】:

如果是用于文档,您可能可以使用常用的docstring conventions

如果您需要稍后在您的应用中使用的更具体的信息,您可以使用enthought traits

如果你想要静态类型,你应该使用不同的语言。

【讨论】:

    【解决方案4】:

    你不能将装饰器放在参数列表中,它必须在函数或类周围。

    您可能希望使用existing decorator 作为装饰器的起点。

    【讨论】:

      【解决方案5】:

      没有。您可以装饰函数和类,但不能装饰参数。

      【讨论】:

      • 那有什么办法可以解决我的问题呢?我是否必须装饰方法本身以提供有关参数的元数据?
      • @Litty:您的问题不是 Python 问题。这是一个 Java 或 C++ 问题。如果你切换语言,你就不必做那么多了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 2014-07-21
      • 2015-08-22
      • 2021-04-24
      • 2011-11-21
      • 2021-09-28
      • 2023-03-17
      相关资源
      最近更新 更多