Как ввести аргументы подсказки фабричного метода, где управляемые экземпляры взяты из универсального класса с дополнителPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как ввести аргументы подсказки фабричного метода, где управляемые экземпляры взяты из универсального класса с дополнител

Сообщение Anonymous »

Рассмотрим следующий случай, когда у нас есть менеджер, который управляет экземплярами определенных классов. Эти классы должны быть подклассами данного класса, но могут определяться пользователем (т.е. являются универсальными).
Поскольку класс Manager владеет экземплярами, вопрос в том, как правильно укажите тип ситуации, поскольку управляемый класс экземпляра может иметь определяемый пользователем конструктор.
Пример:

Код: Выделить всё

class Base:
"""Base class for all instances"""
def __init__(self, base_arg1: int, base_arg2: float):
pass

InstanceType = TypeVar('InstanceType', bounds=Base)  # must be subclass of Base

class Manager(Generic[InstanceType]):
"""The manager class. Is a factory of Instances, creates and owns them. However instances
may have custom extra arguments in their constructor. How to type-hint them correctly?"""
def __init__(self, instance_class: Type[InstanceType]):
self.factory = instance_class
pass

def new_instance(self, ??? )  # how to type hint the extra args of the constructor of InstanceType (without the base_args from Base.__init__)?
self.factory( ???, base_arg1=123, base_arg2=4.56 )
pass

class Instance(Base):
def __init__(self, extra_arg: bool, base_arg1: int, base_arg2: float): # note this has extra_arg: bool
pass

instance_manager = Manager(Instance)  # note  this will be correctly inferred as Manager[Instance]

instance_manager.new_instance(extra_arg=True)  # How can this be correctly type-checked ??

Я думал об использовании Callable в конструкторе менеджера для захвата аргументов функции. Но тогда я не знаю, как действовать дальше.

Код: Выделить всё

class Manager(Generic[InstanceType]):
def __init__(self, instance_class: Callable[ [???], InstanceType]):   # use Callable instead of Type
pass
Остаются вопросы:
  • как захватить аргументы Callable и использовать их в определении ' new_instance' (но без (!) base_args)
  • как обеспечить, чтобы аргументы содержали аргументы базового класса (т. е. base_arg1 и base_arg2).
Для меня 1. важнее всего, я мог бы жить и без 2.

Подробнее здесь: https://stackoverflow.com/questions/772 ... ces-are-fr
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»