Я работаю над общей структурой с целью решения разных, но связанных проблем. Проблема состоит из данных и множества алгоритмов, работающих на этих данных. Данные и алгоритмы могут варьироваться от проблемы к проблеме, поэтому мне нужны разные классы. Но все они имеют общий интерфейс. В какой -то момент в моей программе мне нужна функция/метод, который возвращает экземпляры разных классов в зависимости от значения (не типа) параметра.
from dataclasses import dataclass
from typing import Protocol
# Protocols
class BaseData(Protocol):
common: int
class BaseAlg[D: BaseData](Protocol):
def update(self, data: D) -> None: ...
# Implementations data
@dataclass
class Data1:
common: int
extra: int
@dataclass
class Data2:
common: int
extra: str
# Implementations algorithms
class Alg1:
def update(self, data: Data1) -> None:
data.extra += data.common
class Alg2a:
def update(self, data: Data2) -> None:
data.extra *= data.common
class Alg2b:
def update(self, data: Data2) -> None:
data.extra += "2b"
< /code>
Нет, я хочу заводскую инициализацию алгоритмов и данных (опущенные здесь) для каждой проблемы. < /p>
class FactoryAlgorithms:
def _create_1(self) -> list[BaseAlg[Data1]]:
return [Alg1()]
def _create_2(self) -> list[BaseAlg[Data2]]:
return [Alg2a(), Alg2b()]
def create(self, type_alg: int): # Intuitively I would write list[BaseAlg[BaseData]] which is rejected by mypy, I guess for covariance/contravariance reasons:
Incompatible return value type (got "list[BaseAlg[Data1]]", expected "list[BaseAlg[BaseData]]")
Is there way to tackle this with дженерики? Или этот дизайн принципиально ошибочен?
Подробнее здесь: [url]https://stackoverflow.com/questions/79692625/how-to-type-hint-a-python-factory-method-returning-different-types[/url]
Я работаю над общей структурой с целью решения разных, но связанных проблем. Проблема состоит из данных и множества алгоритмов, работающих на этих данных. Данные и алгоритмы могут варьироваться от проблемы к проблеме, поэтому мне нужны разные классы. Но все они имеют общий интерфейс. В какой -то момент в моей программе мне нужна функция/метод, который возвращает экземпляры разных классов в зависимости от значения (не типа) параметра.[code]from dataclasses import dataclass from typing import Protocol
# Protocols class BaseData(Protocol): common: int
class BaseAlg[D: BaseData](Protocol): def update(self, data: D) -> None: ...
# Implementations data @dataclass class Data1: common: int extra: int
class Alg2b: def update(self, data: Data2) -> None: data.extra += "2b" < /code> Нет, я хочу заводскую инициализацию алгоритмов и данных (опущенные здесь) для каждой проблемы. < /p> class FactoryAlgorithms:
def create(self, type_alg: int): # Intuitively I would write list[BaseAlg[BaseData]] which is rejected by mypy, I guess for covariance/contravariance reasons: Incompatible return value type (got "list[BaseAlg[Data1]]", expected "list[BaseAlg[BaseData]]") Is there way to tackle this with дженерики? Или этот дизайн принципиально ошибочен?
Я хочу создать фабрику, которая будет создавать список словарей, и я хочу иметь возможность передавать итерацию элементов, которые будут служить значениями для одного из элементов в этих словарях, и мне нужно количество словарей в список должен быть...
Мой скрипт читает файлы различных типов (TXT, CSV, JSON, DOCX, PDF, XLSX, HTML) и ищет определенные слова. Он отлично работает для большинства типов файлов, но для файлов HTML возвращает меньше результатов, чем ожидалось. Я использую BeautifulSoup...
Я работаю с WordPress Post Metas и REST SAPI, я подвергал воздействию мета -поля, называемого «picture_collection», которое сохраняло данные как массив целых чисел, где каждое число представляет собой идентификатор прикрепления.
Я затем изменил...
Я работаю с WordPress Post Metas и REST SAPI, я подвергал воздействию мета -поля, называемого «picture_collection», которое сохраняло данные как массив целых чисел, где каждое число представляет собой идентификатор прикрепления.
Я затем изменил...
Я подключил Payfast посредством специальной интеграции. Я на последнем этапе проверки запроса с помощью Payfast, отправив запрос на URL-адрес: string concat =...