Повышение NotImplementedError в абстрактных методахPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Повышение NotImplementedError в абстрактных методах

Сообщение Anonymous »

Изучая исходный код модуля Numbers.py из встроенной библиотеки, я наткнулся на два варианта @abstractmethod (с поднятием NotImplementedError и без него). Пример:

Код: Выделить всё

class Complex(ABC):
@abstractmethod
def __complex__(self):
"""Return a builtin complex instance. Called for complex(self)."""

@abstractmethod
def __neg__(self):
"""-self"""
raise NotImplementedError
Далее я создал дочерний класс:

Код: Выделить всё

class MyComplex(Complex):
def __complex__(self):
return complex(1, 1)

def __neg__(self):
return complex(-1, -1)
Поиграв немного с этим кодом, я обнаружил только одно отличие:

Код: Выделить всё

>>> c = MyComplex()
>>> Complex.__complex__(c)
>>> Complex.__neg__(c)
Traceback (most recent call last):
File "", line 1, in 
File "/home/maskalev/dev/foo/bar.py", line 15, in __neg__
raise NotImplementedError
NotImplementedError
при вызове метода __complex__() возвращается None, а при вызове __neg__() возникает исключение (которое в факт описан в коде).
Поэтому у меня есть несколько вопросов:
  • Это единственная разница?
  • Почему повышение NotImplementedError не используется в первом случае, а используется во втором? (Не лучше ли делать это единообразно?)
  • Какова наилучшая практика? (Я думаю, что лучше явно вызвать исключение, но, возможно, я не вижу всей картины.)


Подробнее здесь: https://stackoverflow.com/questions/787 ... ct-methods
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»