Правильная типизация метода без фиксированной сигнатуры ⇐ Python
Правильная типизация метода без фиксированной сигнатуры
Интересно, как правильно набирать подсказку scrapy.Spider.parse().
Если он определен в подклассе, он имеет определенный первый аргумент (response: Response), но может иметь произвольный список дополнительных аргументов (включая пустой) с * или без него. *кварг. В качестве наилучшего приближения для этого в настоящее время он определен в базовом классе с помощью подписи self, response: Response, **kwargs: Any, но переопределение ее другой подписью приводит к ошибкам mypy. Изменение подписи допустимо с точки зрения API, поскольку правильная подпись в конкретном пользовательском коде зависит от других частей пользовательского кода. Если SpiderA и SpiderB наследуют от scrapy.Spider, обычно имеет смысл ожидать совместимых подписей между SpiderA и его потомки, но не между какими-либо двумя в SpiderA, SpiderB и scrapy.Spider. Но объявление scrapy.Spider.parse() как абстрактного метода и scrapy.Spider как ABC не имеет смысла, поскольку его потомкам не требуется определять parse() вообще (так как они не всегда используют этот метод).
Поэтому мне интересно, существует ли общепринятый способ сообщить инструментам, что дочерние классы могут иметь несколько разные сигнатуры в этом методе, если они вообще его переопределяют, или, в худшем случае, помечать код родительского класса таким образом, чтобы это не t создавать ошибки ввода в пользовательском коде-потомке (я думаю, удаление подсказок типов позволит добиться этого, но это самое последнее средство: хотя можно утверждать, что подсказки типов для этого метода не очень полезны, кажется странным исключать их из одного метода пытаясь набрать подсказку ко всему остальному коду).
Интересно, как правильно набирать подсказку scrapy.Spider.parse().
Если он определен в подклассе, он имеет определенный первый аргумент (response: Response), но может иметь произвольный список дополнительных аргументов (включая пустой) с * или без него. *кварг. В качестве наилучшего приближения для этого в настоящее время он определен в базовом классе с помощью подписи self, response: Response, **kwargs: Any, но переопределение ее другой подписью приводит к ошибкам mypy. Изменение подписи допустимо с точки зрения API, поскольку правильная подпись в конкретном пользовательском коде зависит от других частей пользовательского кода. Если SpiderA и SpiderB наследуют от scrapy.Spider, обычно имеет смысл ожидать совместимых подписей между SpiderA и его потомки, но не между какими-либо двумя в SpiderA, SpiderB и scrapy.Spider. Но объявление scrapy.Spider.parse() как абстрактного метода и scrapy.Spider как ABC не имеет смысла, поскольку его потомкам не требуется определять parse() вообще (так как они не всегда используют этот метод).
Поэтому мне интересно, существует ли общепринятый способ сообщить инструментам, что дочерние классы могут иметь несколько разные сигнатуры в этом методе, если они вообще его переопределяют, или, в худшем случае, помечать код родительского класса таким образом, чтобы это не t создавать ошибки ввода в пользовательском коде-потомке (я думаю, удаление подсказок типов позволит добиться этого, но это самое последнее средство: хотя можно утверждать, что подсказки типов для этого метода не очень полезны, кажется странным исключать их из одного метода пытаясь набрать подсказку ко всему остальному коду).
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение