Вероятно, вы можете получить что-то, что в основном работает, комбинируя вместе generics и перегрузки .
(Примечание: это ссылки на документы mypy, но описанное поведение должнобыть более или менее одинаковым поведением PyCharm. Mypy и PyCharm в основном уважают семантику хинтинга типа PEP 484.)
Например, что-то вроде этого:
from typing import overload, Union, Type, TypeVar
_T = TypeVar('_T', bound=PyPage)
@overload
def start(entry_point: str) -> PyleniumDriver: ...
@overload
def start(entry_point: Type[_T]) -> Type[_T]: ...
def start(entry_point: Union[str, Type[_T]]) -> Union[PyleniumDriver, Type[_T]]:
return PyleniumDriver().maximize().goto(entry_point)
Перегрузки позволяют вамобеспечить что-то вроде ограниченного сопоставления с образцом - средство проверки типов проанализирует ваши входные аргументы, выяснит, какая из определенных перегрузок лучше всего подходит, и выберет соответствующее возвращаемое значение.
TypeVar позволяет нам создавать универсальная функция - короче говоря, когда средство проверки типов определит, какой тип _T
должен быть в одном месте, оно будет использовать этот же тип во всех других местах, где появляется _T
.
Я рекомендую прочитать две ссылки выше, прежде чем пытаться использовать любую из этих функций.Мое объяснение того, что происходит, едва адекватно.