Как намекнуть, что переменная является классом, унаследованным от другого класса?
Рассмотрим этот придуманный фрагмент кода:
class Fooer():
def __init__(self, *args, **kwargs):
# do things
def foo(self) -> int:
# do more things
def foo(fooer, *args, **kwargs) -> int:
return x(*args, **kwargs).foo()
Я хочу намекнуть, что fooer
аргумент foo()
должен быть подклассом Fooer
, Это не пример Fooer
либо Fooer
сам или его подкласс. Лучшее, что я мог придумать, было
def foo(fooer: type, *args, **kwargs) -> int
что не достаточно конкретно.
Как я могу намекнуть это лучше?
2 ответа
Решение
Начиная с PEP-484 ( тип объектов класса), решение заключается в использовании Type[C]
указать подклассы C
, где C
это тип var, ограниченный вашим базовым классом
F = TypeVar('F', bound=Fooer)
def foo(fooer: Type[F], *args,**kwargs) -> int:
...
(Чтобы быть справедливым, я не совсем понимаю разницу между использованием TypeVar
здесь, как указано в PEP-484, вместо использования самого класса, как в ответе @es.)
Там Type
в typing
from typing import Type
class A(object):
def __init__(self, thing):
self.thing = thing
class B(A):
pass
def make_it(a_class: Type[A]):
return a_class(3)
make_it(B) # type checks ok
make_it(str) # type checks complaining