无法使用Pint单元装饰类方法

时间:2016-09-13 04:37:11

标签: python pint

这是一个使用Pint修饰类方法的一个非常简单的例子,

from pint import UnitRegistry

ureg = UnitRegistry()
Q_ = ureg.Quantity

class Simple:
    def __init__(self):
    pass

@ureg.wraps('m/s', (None, 'm/s'), True)
def calculate(self, a, b):
    return a*b

if __name__ == "__main__":
    c = Simple().calculate(1, Q_(10, 'm/s'))
    print c

此代码导致以下ValueError。

Traceback (most recent call last):
   c = Simple().calculate(1, Q_(10, 'm/s'))
   File "build/bdist.macosx-10.11-intel/egg/pint/registry_helpers.py",   line 167, in wrapper
   File "build/bdist.macosx-10.11-intel/egg/pint/registry_helpers.py", line 118, in _converter
   ValueError: A wrapped function using strict=True requires quantity for all arguments with not None units. (error found for m / s, 1)

在我看来,这里的问题可能是将类实例传递给pint装饰器。有人会有解决这个问题的解决方案吗?

2 个答案:

答案 0 :(得分:1)

我认为错误信息非常清楚。 In strict mode all arguments have to be given as Quantity 但你只能给出第二个论点。

您要么将第一个参数设为Quantity

if __name__ == "__main__":
    c = Simple().calculate(Q_(1, 'm/s'), Q_(10, 'm/s'))
    print c

或者你禁用严格模式,我认为这是你正在寻找的。

    ...
    @ureg.wraps('m/s', (None, 'm/s'), False)
    def calculate(self, a, b):
        return a*b

if __name__ == "__main__":
    c = Simple().calculate(1, Q_(10, 'm/s'))
    print c

答案 1 :(得分:1)

感谢您的回答。保持严格模式,你的第一个答案产生一个输出,即使第一个参数也是品脱数量。但是,输出的单位包括包装器中指定的输出单元的乘法和第一个参数的单位,这是不正确的。

解决方案只是在包装器中添加另一个“无”来解释类实例,即

@ureg.wraps('m/s', (None, None, 'm/s'), True)
def calculate(self, a, b):
    return a*b