Предположим, у меня есть метод класса, который служит фабрикой:

class Foo:

  def __init__(self, text):
    self.text = text

  @classmethod
  def from_file(cls, path):
    with open(path, 'rt') as f:
      return cls(f.read())


class Bar(Foo):

  def lines(self):
    return self.text.count('\n')


print(Bar.from_file('bar.txt').lines())

Теперь я хочу добавить к этому аннотации pytype. Какие аннотации следует использовать для метода класса from_file? Простая маркировка его как -> 'Foo' не захватывает более конкретный тип, известный в случае производного класса, такого как Bar. Таким образом, выражение в вызове print не будет знать, что это Bar и имеет lines. Как я могу выразить, что результатом будет экземпляр аргумента cls?

1
MvG 18 Июн 2020 в 20:50

1 ответ

Лучший ответ

Для этого вы можете использовать переменную типа.

from typing import Type, TypeVar


FooType = TypeVar('FooType', bound='Foo')


class Foo:

  text: str

  def __init__(self, text: str):
    self.text = text

  @classmethod
  def from_file(cls: Type[FooType], path: str) -> FooType:
    with open(path, 'rt') as f:
      return cls(f.read())


class Bar(Foo):

  def lines(self) -> int:
    return self.text.count('\n')


print(Bar.from_file('bar.txt').lines())
1
MvG 18 Июн 2020 в 17:50