Как намекнуть, что переменная является классом, унаследованным от другого класса?

Рассмотрим этот придуманный фрагмент кода:

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
Другие вопросы по тегам