2016-09-13 2 views
2

Вот очень простой пример, в стремлении украсить метод класса с использованием пинты,Невозможно украсить метод класса, используя единицы пинты

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) 

Мне кажется, что проблема здесь в том, что экземпляры классов передаются в декоратор пинты. У кого-нибудь есть решение для этого?

ответ

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

Спасибо за ответ. Сохраняя строгий режим, ваш первый ответ выводит результат, т. Е. Также делает первый аргумент пинтом. Однако единицы вывода включают в себя умножение единицы вывода, указанного в обертке, и единиц первого аргумента, что неверно.

Раствор просто добавить еще один «Нет» на обертку для учета экземпляра класса, т.е.

@ureg.wraps('m/s', (None, None, 'm/s'), True) 
def calculate(self, a, b): 
    return a*b 
Смежные вопросы