为Python函数参数提供额外的装饰/元数据有什么好方法?

Wil*_*ean 7 python

我们正在考虑使用Python(IronPython,但我认为不相关)为另一个控制设备的应用程序提供一种"宏"支持.

我们想在Python中编写相当简单的函数,这些函数需要一些参数 - 这些函数可能是时间,温度和位置等.不同的函数将采用不同的参数,主应用程序将包含用户界面(类似于属性网格),允许用户为Python函数参数提供值.

因此,例如,function1可能需要一个时间和一个温度,而function2可能需要一个位置和几次.

我们希望能够从Python代码动态构建用户界面.容易做的事情是在模块中查找函数列表,并(使用inspect.getargspec)获取每个函数的参数列表.

然而,只是一个参数名称列表还不够 - 理想情况下我们希望能够包含关于每个参数的更多信息 - 例如,它是'类型'(高级类型 - 时间,温度等,而不是语言级别类型),也许是一个"友好名称"或描述.

所以,问题是,有什么好的'pythonic'方法可以将这种信息添加到函数中.

我想到的两种可能性是:

  • 对参数使用严格的命名约定,然后从名称中推断出它们的内容(使用getargspec获取)

  • 发明我们自己的docstring元语言(可能只是CSV)并使用docstring作为我们的元数据.

因为Python似乎非常流行用于构建大型应用程序的脚本,我想这是一个常见约定的解决问题,但我无法找到它们.

nmi*_*els 7

装饰器是向函数添加元数据的好方法.添加一个类型列表以附加到.params属性或其他内容:

def takes(*args):
    def _takes(fcn):
        fcn.params = args
        return fcn
    return _takes

@takes("time", "temp", "time")
def do_stuff(start_time, average_temp, stop_time):
    pass
Run Code Online (Sandbox Code Playgroud)

  • 考虑使用对象而不是字符串来描述类型:`@takes(Time,Temp,Time)`.字符串不是很好的方法,因为你不能在不修改核心的情况下扩展该模型.您的核心也可以通过无状态(您不必注册类型名称).您的对象应该知道如何将自身呈现为HTML以及如何验证自身.你也可以参与你的类型:`@takes(Int(max = 100,min = 0))`. (4认同)