Что делает знак плюс перед переменной в Python?

В проекте, который я должен поддерживать, есть следующий фрагмент кода Python:

# If the `factor` decimal is given, compute new price and a delta
factor = +factor.quantize(TWOPLACES)
new_price = +Decimal(old_price * factor).quantize(TWOPLACES)
delta = new_price - old_price

Вопрос здесь заключается в назначении + перед переменной.

Документы Python вызовите его унарный плюс оператор , который «выдает свой числовой аргумент без изменений». Можно ли его безопасно удалить тогда?

(Кстати, код был написан мной некоторое время назад, надеюсь, я усвоил урок — это не было бы вопросом, если бы существовали тесты или если бы в комментариях было разъяснено использование унарного плюса для десятичного числа.)


person Anton Strogonoff    schedule 25.05.2012    source источник
comment
Что происходит, когда вы удаляете его?   -  person Corey Ogburn    schedule 25.05.2012
comment
Ничего очевидного, но, поскольку речь идет о конфиденциальной числовой информации (цены на продукты), лучше знать наверняка. Увы, соответствующие тесты отсутствуют.   -  person Anton Strogonoff    schedule 25.05.2012
comment
Я уверен, что в этом есть какая-то цель. Я не знаю ответа, но мне было любопытно, есть ли непосредственная, заметная разница.   -  person Corey Ogburn    schedule 25.05.2012
comment
@CoreyOgburn, хорошая мысль. Вопросы, на которые можно было бы ответить, просто попробовав, возникают здесь довольно часто. И в этом случае надлежащие тесты на обработку цен также устранили бы неопределенность. (Думаю, я оставлю это для справки. Официальные документы говорят, что унарный плюс оставляет аргумент без изменений, но это не относится к десятичному числу.)   -  person Anton Strogonoff    schedule 25.05.2012


Ответы (2)


То, что делает этот знак плюс, зависит от того, для чего он определен результатом этого выражения (вызывается метод __pos__() этого объекта). В данном случае это объект Decimal, а унарный плюс эквивалентен вызову метода plus(). По сути, он используется для применения текущего контекста (точность, округление и т. д.) без изменения знака числа. Найдите вызов setcontext() или localcontext() в другом месте, чтобы увидеть контекст. Дополнительную информацию см. здесь.

Унарный плюс используется не очень часто, поэтому неудивительно, что такое его использование незнакомо. Я думаю, что модуль decimal — единственный стандартный модуль, который его использует.

person kindall    schedule 25.05.2012
comment
Спасибо! Действительно существует вызов setcontext(Context(rounding=ROUND_UP)) в начале модуля. - person Anton Strogonoff; 25.05.2012

Я столкнулся с той же проблемой, когда ошибочно предположил, что Python должен поддерживать оператор приращения C (++); это не так! Вместо этого он дважды применяет оператор со знаком плюс (+)! Что ничего не делает дважды, как я скоро узнал. Однако из-за того, что "++n" выглядел правильно... не помечен как синтаксическая ошибка... я создал себе ужасную ошибку.

Поэтому, если вы не переопределите, что он делает, унарный + на самом деле ничего не делает. Унарный - меняется с положительного на отрицательное и наоборот, поэтому "--n" тоже не помечается как синтаксическая ошибка, но и ничего не делает.

person Brian Overland    schedule 17.11.2016