Python:方法参数的装饰器是否可行?

3

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

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

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

谢谢, Litty


什么样的元数据?您不能使用文档字符串吗? - mouad
5个回答

8
不可以,但在Python 3中你可以使用注解
def func(arg: Param(type = 'int', unit = 'MB')):
   pass

注解可以包含任何你想要的信息,语言并不定义应该放什么。你可以稍后使用 func.__annotations__ 字典访问它们。


谢谢!有趣的是,PEP - http://www.python.org/dev/peps/pep-3107/ - 表示属性被称为 func_annotations,而不是 __annotations__。这是否已经过时了?PEP是否会过时?:). 我一直在收到AttributeError,无法理解我做错了什么。 - thule
@letitbee:我认为你应该首先查阅语言参考,然后再查看PEP,至少对于已经实现的语言特性而言是这样。即使在3.0版本中,注释也存储在__annotations__中,所以我猜他们决定在发布PEP和实现之间的某个时候进行更改。 - Cat Plus Plus
实际上,我引用PEP-1中的话说:“PEP应该提供有关功能的简明技术规范<...>”。尽管如果你是对的,我们不能信任PEP,那么我们也不能信任PEP-1!;) - thule

4
如果是文档方面的内容,您可以使用常用的docstring约定
如果是更具体的信息以供后续在应用程序中使用,您可以使用Enthought Traits
如果您想要静态类型,则应使用不同的语言。

3

不行。你可以装饰函数和类,但不能装饰参数。


那么解决我的问题的方法是什么?我需要装饰方法本身以提供关于参数的元数据吗? - Litty
@Litty:你的问题不是Python的问题。这是Java或C++的问题。如果你转换语言,你就不需要做那么多了。 - S.Lott

1

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

例如:

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

有趣。我不知道这个。+1 - Noufal Ibrahim

1

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

你可能想要使用一个现有的装饰器作为你的装饰器的起点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接