Мне было интересно узнать, как лучше всего указывать недопустимые комбинации аргументов в Python. Я сталкивался с несколькими ситуациями, когда у вас есть такая функция:
def import_to_orm(name, save=False, recurse=False):
"""
:param name: Name of some external entity to import.
:param save: Save the ORM object before returning.
:param recurse: Attempt to import associated objects as well. Because you
need the original object to have a key to relate to, save must be
`True` for recurse to be `True`.
:raise BadValueError: If `recurse and not save`.
:return: The ORM object.
"""
pass
Единственное раздражение в этом заключается в том, что каждый пакет имеет свои, обычно немного отличающиеся BadValueError
. Я знаю, что в Java существует java.lang.IllegalArgumentException
- хорошо ли понимают, что все будут создавать свои собственные BadValueError
в Python или есть другой, предпочтительный метод?
math.sqrt(-1)
, это программная ошибка, которую нужно все равно исправить.ValueError
не предназначен, чтобы быть пойманным в нормальном выполнении программы, или это было бы получено изRuntimeError
.Я бы унаследовал от
ValueError
Иногда лучше создавать свои собственные исключения, но наследовать от встроенного, которое максимально приближено к тому, что вы хотите.
Если вам нужно поймать эту конкретную ошибку, полезно иметь имя.
источник
Я думаю, что лучший способ справиться с этим - это то, как сам Python справляется с этим. Python вызывает ошибку TypeError. Например:
Наш младший разработчик только что нашел эту страницу в поиске Google для «неправильных аргументов исключения Python», и я удивлен, что очевидный (для меня) ответ никогда не предлагался в течение десятилетия с тех пор, как был задан этот вопрос.
источник
int('a')
). источникsum()
без аргументов, что являетсяTypeError
, но OP касался «недопустимых» комбинаций значений аргументов, когда типы аргументов верны. В этом случае обаsave
иrecurse
являются bools, но еслиrecurse
есть,True
тоsave
не должно бытьFalse
. ЭтоValueError
. Я согласен, что на некоторую интерпретацию названия вопроса будет дан ответTypeError
, но не для приведенного примера.Я в основном только что видел встроенный
ValueError
в этой ситуации.источник
Это зависит от того, в чем проблема с аргументами.
Если аргумент имеет неправильный тип, вызовите TypeError. Например, когда вы получаете строку вместо одного из этих логических значений.
Однако обратите внимание, что в Python мы редко делаем какие-либо проверки, подобные этой. Если аргумент действительно недействителен, более глубокая функция, вероятно, сделает жалобу за нас. И если мы проверим только логическое значение, возможно, какой-то пользователь кода позже просто передаст ему строку, зная, что непустые строки всегда равны True. Это может спасти его.
Если аргументы имеют недопустимые значения, вызовите ValueError. Это кажется более подходящим в вашем случае:
Или в этом конкретном случае истинное значение recurse подразумевает истинное значение save. Поскольку я считаю, что это восстановление после ошибки, вы также можете пожаловаться в журнале.
источник
Я не уверен , что я согласен с наследованием от
ValueError
- моей интерпретации документации , чтоValueError
это только предполагается , поднятый ... наследуя встроенных команд от него или поднять его сами , кажется неправильным.- ValueError документация
источник
ValueError
для такого рода вещей, поэтому я думаю, что вы пытаетесь слишком много прочитать в документации.Согласитесь с предложением Маркуса откатить собственное исключение, но текст исключения должен прояснить, что проблема в списке аргументов, а не в значениях отдельных аргументов. Я бы предложил:
Используется, когда отсутствуют аргументы ключевого слова, которые требовались для определенного вызова, или значения аргументов индивидуально действительны, но несовместимы друг с другом.
ValueError
все равно будет правильным, если конкретный аргумент имеет правильный тип, но находится вне диапазона.Разве это не должно быть стандартным исключением в Python?
В общем, я хотел бы, чтобы стиль Python был немного более четким в различении плохих входов в функцию (ошибка вызывающего) и плохих результатов в функции (моя ошибка). Таким образом, может также существовать ошибка BadArgumentError, чтобы отличать значения ошибок в аргументах от ошибок значений в локальных объектах.
источник
KeyError
для ключевого слова не найдено (так как пропущенное явное ключевое слово семантически идентично**kwargs
dict, в котором отсутствует этот ключ).