source

Python에서 잘못된 인수/불법 인수 조합에 대해 어떤 예외를 제기해야 합니까?

factcode 2022. 9. 29. 00:09
반응형

Python에서 잘못된 인수/불법 인수 조합에 대해 어떤 예외를 제기해야 합니까?

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.lang.IllegalArgumentExceptionBadValueErrorPython 는 른 른 른 른 른 른 python python python python python python?

Value Error만 올리면 됩니다만, 보다 구체적인 예외가 필요한 경우는 제외합니다.

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- 커스텀 클래스는 Value Error와 동일한데, 왜 사용하지 않는가?

나는 로부터 물려받을 것이다.ValueError

class IllegalArgumentError(ValueError):
    pass

경우에 따라서는, 독자적인 예외를 작성하는 것이 좋을 수 있습니다만, 가능한 한 원하는 것에 가까운 빌트인 예외를 상속하는 것이 좋습니다.

특정 에러를 검출할 필요가 있는 경우는, 이름을 붙이는 것이 도움이 됩니다.

이 문제를 해결하는 가장 좋은 방법은 비단뱀 자체가 처리하는 방법이라고 생각합니다.Python은 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년 동안 단 한 번도 명확한 답이 제시되지 않았다는 사실에 놀랐습니다.

그것은 논쟁의 문제가 무엇이냐에 달려있다.

인수의 유형이 올바르지 않은 경우 TypeError를 발생시킵니다.예를 들어, Boohan이 아닌 문자열을 얻을 수 있습니다.

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

그러나 Python에서는 이와 같은 체크는 거의 하지 않습니다.만약 그 주장이 정말 무효라면, 어떤 더 깊은 함수가 우리를 위해 불평을 할 것이다.부울 값만 체크하면 공백이 아닌 문자열이 항상 True인 것을 알고 나중에 일부 코드 사용자가 문자열만 제공할 수 있습니다.깁스를 줄일 수 있을 거야

인수에 비활성 값이 있는 경우 ValueError를 발생시킵니다.이것은 고객의 경우에 더 적합한 것 같습니다.

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

또는 이 경우 True value of recurse는 True value of save를 의미합니다.이것은 에러로부터의 회복이라고 생각하기 때문에, 로그에도 불만을 표시하는 것이 좋을지도 모릅니다.

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

저는 이제 막 빌트인을 본 적이 있습니다.ValueError이 상황에서 사용됩니다.

가장 많이 사용하는 것은ValueError(raise ValueError()단, 불량값의 유형에 따라 달라집니다.예를 들어 문자열만 허용하는 함수를 만들었을 때 사용자가 정수를 대신 입력했다면 다음과 같습니다.TypeError대신.사용자가 잘못 입력한 경우(유형은 올바르지만 특정 조건을 충족하지 않음)Value Error가장 좋은 선택일 겁니다 Value오류는 프로그램을 다른 예외로부터 차단하기 위해서도 사용할 수 있습니다. 예를 들어,ValueError조개껍데기가 올라가지 않도록 하다ZeroDivisionError예를 들어, 이 기능에서는 다음과 같습니다.

def function(number):
    if not type(number) == int and not type(number) == float:
        raise TypeError("number must be an integer or float")
    if number == 5:
        raise ValueError("number must not be 5")
    else:
        return 10/(5-number)

P.S. python 내장 예외 목록은 https://docs.python.org/3/library/exceptions.html (이것은 공식 python 데이터뱅크입니다)를 참조해 주세요.

자신의 예외를 롤하는 Markus의 제안에 동의하지만 예외의 텍스트는 문제가 개별 인수 값이 아니라 인수 목록에 있음을 명확히 해야 합니다.제안합니다.

class BadCallError(ValueError):
    pass

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

Python에서는 이것이 표준 예외가 되어야 하지 않나요?

일반적으로 Python 스타일은 함수에 대한 잘못된 입력(발신자 오류)과 함수 내의 잘못된 결과(내 오류)를 좀 더 명확하게 구별했으면 합니다.따라서 인수 값 오류와 로컬 값 오류를 구별하기 위해 BadArgumentError도 있을 수 있습니다.

로부터의 상속에 동의할 수 있을지 잘 모르겠습니다.ValueError--문서에 대한 저의 해석은 다음과 같습니다.ValueError빌트인만 키워야 하는데...물려받거나 직접 키우는 게 잘못된 것 같아요.

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

-- ValueError 문서

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

반응형