#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
.
Пока они разделены, почему пользователи должны быть предупреждены о таких внутренних элементах? Если другой модуль полагается на оба, потребуете ли вы, чтобы он их заменил? Было бы кошмаром отслеживать такие столкновения имен.