Programming

파이썬에서 나쁜 / 잘못된 인수 조합에 대해 어떤 예외를 제기해야합니까?

procodes 2020. 2. 13. 00:55
반응형

파이썬에서 나쁜 / 잘못된 인수 조합에 대해 어떤 예외를 제기해야합니까?


파이썬에서 잘못된 인수 조합을 나타내는 모범 사례가 궁금합니다. 나는 당신이 다음과 같은 기능을하는 몇 가지 상황을 겪었습니다.

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파이썬으로 자신 것을 만들 거나 다른 선호되는 방법 이 있는지 잘 알고 있습니까?


더 구체적인 예외가 필요하지 않으면 ValueError발생합니다.

def import_to_orm(name, save=False, recurse=False):
    if recurse and not save:
        raise ValueError("save must be True if recurse is True")

실제로 할 점은 없습니다. class BadValueError(ValueError):pass사용자 정의 클래스는 ValueError동일하게 사용 되므로 왜 사용하지 않습니까?


나는 ~로부터 물려 받았다 ValueError

class IllegalArgumentError(ValueError):
    pass

때로는 자신 만의 예외를 만드는 것이 좋지만 가능한 한 원하는 것과 가까운 내장 예외를 상속하는 것이 좋습니다.

특정 오류를 잡아야하는 경우 이름을 갖는 것이 도움이됩니다.


나는 이것을 처리하는 가장 좋은 방법은 파이썬 자체가 그것을 처리하는 방법이라고 생각합니다. 파이썬은 TypeError를 일으 킵니다. 예를 들면 다음과 같습니다.

$ python -c 'print(sum())'
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: sum expected at least 1 arguments, got 0

우리 주니어 개발자는 구글 검색에서 "파이썬 예외 잘못된 논증"에 대한이 페이지를 발견했으며이 질문이 제기 된 이후 10 년 동안 명백한 (나에게) 대답이 제안되지 않은 것에 놀랐다.


나는 ValueError이 상황에서 주로 사용되는 내장을 보았습니다 .


인수의 문제점이 무엇인지에 달려 있습니다.

인수의 유형이 잘못된 경우 TypeError를 발생시킵니다. 예를 들어, 부울 중 하나 대신 문자열을 얻는 경우.

if not isinstance(save, bool):
    raise TypeError(f"Argument save must be of type bool, not {type(save)}")

그러나 파이썬에서는 이와 같은 검사를 거의하지 않습니다. 만약 그 주장이 실제로 유효하지 않다면, 더 깊은 기능이 아마도 우리에게 불평을 할 것입니다. 부울 값만 확인하면 나중에 일부 코드 사용자는 비어 있지 않은 문자열이 항상 True라는 것을 알고 문자열을 제공 할 것입니다. 캐스트를 구할 수도 있습니다.

인수에 유효하지 않은 값이 있으면 ValueError를 발생시킵니다. 이것은 귀하의 경우에 더 적절 해 보입니다.

if recurse and not save:
    raise ValueError("If recurse is True, save should be True too")

또는이 특정한 경우, 재귀의 True 값을 가지면 True 값의 저장을 의미합니다. 이 오류를 복구 한 것으로 간주하므로 로그에 불만을 표시 할 수도 있습니다.

if recurse and not save:
    logging.warning("Bad arguments in import_to_orm() - if recurse is True, so should save be")
    save = True

Markus의 제안에 동의하여 자신의 예외를 굴리십시오. 그러나 예외 텍스트는 문제가 개별 인수 값이 아니라 인수 목록에 있음을 명확히해야합니다. 나는 제안 할 것이다 :

class BadCallError(ValueError):
    pass

특정 호출에 필요한 키워드 인수가 누락되었거나 인수 값이 개별적으로 유효하지만 서로 일치하지 않을 때 사용됩니다. ValueError특정 인수가 올바른 유형이지만 범위를 벗어난 경우에도 여전히 옳습니다.

이것이 파이썬에서 표준 예외가 아니어야합니까?

일반적으로 파이썬 스타일은 함수의 잘못된 입력 (발신자의 결함)과 함수의 나쁜 결과 (내 결함)를 구별하는 데 조금 더 선명하고 싶습니다. 따라서 인수의 값 오류와 로컬의 값 오류를 구별하는 BadArgumentError도있을 수 있습니다.


나는 확실히 내가로부터 상속에 동의하지있어 ValueError그가되는 설명서의 내 해석 - ValueError입니다 그것으로부터 상속 또는 자신이 잘못된 것 같다 그것을 제기 ... 내장 명령에 의해 제기 할 예정.

내장 연산 또는 함수가 올바른 유형이지만 부적절한 값을 갖는 인수를 수신하고 상황이 IndexError와 같은보다 정확한 예외에 의해 설명되지 않을 때 발생합니다.

- ValueError를 문서

참고 URL : https://stackoverflow.com/questions/256222/which-exception-should-i-raise-on-bad-illegal-argument-combinations-in-python



반응형