исключения python с тем же именем, но с другим подклассом

#python #exception

#python #исключение

Вопрос:

Я читаю документ python, и в нем упоминается, что

Два класса исключений, которые не связаны через подклассы, никогда не эквивалентны, даже если они имеют одно и то же имя.

Я не уверен, почему возможно иметь два класса исключений с тем же именем, но с разными подклассами. Разве в этом случае не должна быть сгенерирована какая-то ошибка / предупреждение?

Комментарии:

1. Линтер, вероятно, будет жаловаться, если вы затеняете существующее имя, но нет никаких причин для того, чтобы это было ошибкой с точки зрения интерпретатора — вы можете захотеть затенить его.

Ответ №1:

Исключения — это просто определенные типы классов. Имена классов — это просто то, как они определены. Запрещение того, чтобы классы имели одно и то же имя, затормозило бы множество схем кодирования. Один из таких примеров действительно работает с исключениями: программы, которые должны быть обратно совместимы с python2.6, часто переопределяются subprocess.CalledProcessError для соответствия интерфейсу python2.7/3.X.

Как у вас могут быть два исключения с одинаковыми именами, но с разными подклассами? Например, вы можете сделать следующее:

 class ExceptoPatronum(KeyError):
    pass

KExcept = ExceptoPatronum

class ExceptoPatronum(OSError):
    pass

OExcept = ExceptoPatronum
  

Классы называются одинаково, но не равны и не являются экземплярами друг друга:

 print(KExcept.__name__)
print(OExcept.__name__)
print(KExcept == OExcept, KExcept is OExcept)
  

Это (надуманный) пример, который выполняется даже с одним файлом. Однако представьте, что у вас есть два отдельных модуля, каждый из которых определяет свой собственный пользовательский класс, скажем, с тем же именем ResourceUnavailable .

Пока они разделены, почему пользователи должны быть предупреждены о таких внутренних элементах? Если другой модуль полагается на оба, потребуете ли вы, чтобы он их заменил? Было бы кошмаром отслеживать такие столкновения имен.