python:方法参数的装饰器可能吗?

Posted

技术标签:

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

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

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

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

谢谢, 小

【问题讨论】:

什么样的元数据?你不能为此使用文档字符串吗? 【参考方案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++ 问题。如果你切换语言,你就不必做那么多了。

以上是关于python:方法参数的装饰器可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

32.Python面向对象描述符运算符底层装饰器:闭包-闭包参数-内置装饰器-类装饰器

32.Python面向对象描述符运算符底层装饰器:闭包-闭包参数-内置装饰器-类装饰器

Python进阶精华-编写装饰器为被包装的函数添加参数

Python子类方法从超类方法继承装饰器

对函数和方法使用相同的装饰器(带参数)

面向对象之classmethod和staticmethod(python内置装饰器)