Как намекнуть, что переменная является классом, унаследованным от другого класса? - PullRequest
0 голосов
/ 12 июня 2018

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

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 ]

0 голосов
/ 12 июня 2018

там 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
0 голосов
/ 12 июня 2018

Начиная с PEP-484 ( Тип объектов класса ), решение заключается в использовании Type[C] для обозначения подклассов C, где C - это тип var, ограниченный вашим базовым классом.

F = TypeVar('F', bound=Fooer)

def foo(fooer: Type[F], *args,**kwargs) -> int:
    ...

(Если честно, я не совсем понимаю разницу между использованием TypeVar здесь, как указано в PEP-484, и использованием самого класса, как в ответе @ es.)

...