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




exception arguments (6)

마커스의 제안에 동의한다. 그러나 예외 텍스트는 문제가 개별 인수 값이 아니라 인수 목록에 있음을 분명히해야한다. 나는 제안 할 것이다 :

class BadCallError(ValueError):
    pass

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

이것은 파이썬에서 표준 예외가되어서는 안됩니까?

일반적으로 파이썬 스타일은 잘못된 입력을 함수 (호출자의 잘못)와 함수의 잘못된 결과 (함수 오류)로 구별하는 데 좀 더 예리하다. 따라서 지역 변수의 값 오류와 인수의 값 오류를 구별하는 BadArgumentError가있을 수 있습니다.

나는 파이썬에서 잘못된 인수 조합을 나타내는 최상의 방법에 대해 궁금해했다. 나는 다음과 같은 함수가있는 몇 가지 상황을 발견했습니다.

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 이 있다는 것을 알고 있습니다 - 모든 사람들이 Python에서 자신의 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 를 수행 할 필요가 없습니다 class BadValueError(ValueError):pass - 사용자 정의 클래스가 ValueError 와 사용상 동일하므로 사용하지 않는 이유는 무엇입니까?


대부분이 상황에서 ValueError 가 내장 된 것을 보았습니다.


ValueError 상속 ValueError

class IllegalArgumentError(ValueError):
    pass

때로는 예외를 직접 작성하는 것이 더 나을 수도 있지만 가능하면 원하는 것에 가깝게 내장 된 내장 예외를 상속합니다.

그 특정 오류를 포착 할 필요가 있다면, 이름을 가진 것이 도움이됩니다.


나는 ValueError 상속에 동의하지 않는다. 나의 문서 해석은 ValueError 가 내장 ValueError의해서만 발생한다고 가정한다. 상속을 받거나 스스로를 올리는 것은 잘못된 것처럼 보인다.

기본 제공 연산 또는 함수가 올바른 형식이지만 부적절한 값을 갖는 인수를 받으면이 상황은 IndexError와 같은보다 정확한 예외로 설명되지 않습니다.

- ValueError 문서


방법 3은 매우 산뜻한 것처럼 보이지만, Python 2Python 3 모두에서 프로그램을 실행 시키려면 작동하지 않습니다. Python 3 버전이 Python 2에서 구문 오류를 제공하기 때문에 Python 버전에 대한 테스트로 개별 변형을 보호하는 것조차 실패합니다.

Mike Watkins에게 감사드립니다. http://mikewatkins.ca/2008/11/29/python-2-and-3-metaclasses/ . 프로그램이 Python 2와 Python 3에서 모두 작동하게하려면 다음과 같이해야합니다.

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

MC = Singleton('MC', (object), {})

class MyClass(MC):
    pass    # Code for the class implementation

나는 과제의 '객체'가 'BaseClass'로 대체되어야한다고 생각하지만, 시도하지 않았다. (나는 그림과 같이 코드를 시도했다.)





python exception arguments