Как получить полезное сообщение об исключении из десятичного числа в Python 3? - PullRequest
0 голосов
/ 21 марта 2019

В Python 2 создание десятичного числа с недопустимой строкой приводит к полезному сообщению об ошибке:

>>> import decimal
>>> decimal.Decimal('spam')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/decimal.py", line 547, in __new__
    "Invalid literal for Decimal: %r" % value)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/decimal.py", line 3872, in _raise_error
    raise error(explanation)
decimal.InvalidOperation: Invalid literal for Decimal: 'spam'

В то время как Python 3 выдает не очень полезное сообщение:

>>> import decimal
>>> decimal.Decimal('spam')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]

Есть ли способ получить полезное сообщение типа «Неверный литерал для десятичного:« спам »» из исключения в Python 3?

Я использую Python 2.7.15 и Python 3.7.2, оба на darwin.

Дополнения :

Похоже, что у Python 2 когда-то было не очень полезное сообщение для десятичного числа. InvalidOperation: https://bugs.python.org/issue1770009

ThisСитуация выглядит аналогично, но большинство из них идет через голову: https://bugs.python.org/issue21227

1 Ответ

1 голос
/ 21 марта 2019

Вы можете сделать обезьяны-патчи для модуля decimal.

import decimal


def safe_decimal(something):
    try:
        funct_holder(something)
    except Exception as e:
        new_errror = Exception("Hey silly that's not a decimal, what should I do with this? {}".format(something))
        raise new_errror from None


funct_holder = decimal.Decimal
decimal.Decimal = safe_decimal

Тогда вы можете использовать версию с патчами для обезьян, как, например,

>>> decimal.Decimal('hello')
Traceback (most recent call last):
  File "<input>", line 12, in <module>
  File "<input>", line 6, in safe_decimal
Exception: Hey silly that's not a decimal, what should I do with this? hello
...