파이썬에서 나쁜/불법적 인 논증 조합을 제기 해야하는 예외는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/256222

  •  05-07-2019
  •  | 
  •  

문제

파이썬에서 잘못된 인수 조합을 나타내는 모범 사례에 대해 궁금했습니다. 나는 당신이 그렇게 함수가있는 몇 가지 상황을 발견했습니다.

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.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

때로는 자신만의 예외를 만드는 것이 더 낫지 만 가능한 한 원하는 것과 가까운 내장에서 물려받습니다.

해당 특정 오류를 포착 해야하는 경우 이름을 갖는 것이 도움이됩니다.

나는 이것을 처리하는 가장 좋은 방법은 Python 자체가 그것을 처리하는 방식이라고 생각합니다. 파이썬은 타입 원성을 올립니다. 예를 들어:

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

우리 주니어 데브 (Junior Dev)는 "파이썬 예외 잘못된 인수"에 대한 Google 검색 에서이 페이지를 찾았 으며이 질문이 제기 된 이후 10 년 동안 명백한 (나에게) 대답이 제안되지 않았다는 사실에 놀랐습니다.

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

나는 상속에 동의하는지 확신하지 못한다 ValueError - 문서에 대한 나의 해석은 그 것입니다 ValueError ~이다 건축물에 의해 자란 것으로 추정됩니다.

내장 작업 또는 기능이 올바른 유형이지만 부적절한 값을 갖는 인수를받을 때 제기되며 상황은 indexerror와 같은보다 정확한 예외로 설명되지 않습니다.

-- ValueError 문서

그것은 논쟁의 문제가 무엇인지에 달려 있습니다.

인수에 잘못된 유형이 있으면 TypeError를 올리십시오. 예를 들어, 부울 중 하나 대신 문자열을 얻을 때.

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

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

인수에 잘못된 값이 있으면 ValueError를 높이십시오. 이것은 귀하의 경우에 더 적합한 것 같습니다.

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

또는이 특정한 경우, Reburse의 진정한 값은 실제 저장 값을 암시합니다. 이것을 오류로부터 복구 한 것으로 간주하기 때문에 로그에서 불만을 제기 할 수도 있습니다.

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가있을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top