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面向对象描述符运算符底层装饰器:闭包-闭包参数-内置装饰器-类装饰器