#python #type-hinting #python-typing #pylance
Вопрос:
Я не совсем уверен, какова цель сообщения о ненужном isinstance, и я, как правило, регулярно получаю предупреждения об этом в своих установщиках, когда делаю что-то вроде:
@foo.setter
def foo(self, val: int):
if not isinstance(val, int):
raise ValueError()
Итак, здесь Пиланс предупреждает меня, что «int всегда является экземпляром int», что, безусловно, имеет смысл, но я хочу убедиться, что то, что было предоставлено, на самом деле было int, и завершить код с ошибкой, если это не так.
Другие способы ввода, чтобы избежать этого конкретного предупреждения, о которых я думал:
@foo.setter
def foo(self, val):
if not isinstance(val, int):
raise ValueError()
В этом случае я, конечно, получаю предупреждение, что the type of val is unknown
вместо этого. Наконец, есть эта опция, которая удаляет все предупреждения, но я не уверен, что использовать Any
ее таким образом разумно:
@foo.setter
def foo(self, val: Any):
if not isinstance(val, int):
raise ValueError()
Какой из них более корректен синтаксически и семантически? Или, может быть, мне следует просто отключить это предупреждение в настройках?
Комментарии:
1. Ну, вы хотите, чтобы код выполнял проверку типа, или вы хотите, чтобы статическая проверка кода считывала аннотации и делала это? Какую проблему вы пытаетесь решить с помощью Pylance в первую очередь?
2. @KarlKnechtel, в данном конкретном случае я хочу, чтобы мой код выполнял необходимую проверку типов, но я также не хочу видеть предупреждения, если есть способ избежать их.
3. Не пользователь Pylance, поэтому я могу ошибаться, но я бы предположил, что цель функции reportUnnecessaryIsinstance заключается в том, что использование isinstance нарушает принцип подстановки Лискова (LSP), один из ТВЕРДЫХ принципов объектно-ориентированного программирования. Принципы SOLID предназначены для создания кода, который легче поддерживать. Если ваш код не является объектно-ориентированным, я бы ожидал (хотя я далеко не эксперт), что применение LSP не имеет отношения к делу.