Как определить сигнатуру метода в подклассеPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как определить сигнатуру метода в подклассе

Сообщение Anonymous »

Я реализую шаблон репозитория в качестве упражнения по набору текста.
У меня есть несколько несвязанных между собой моделей SQLAlchemy:

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

class Base(MappedAsDataclass, DeclarativeBase):
id: Mapped[primary_key] = mapped_column(init=False)

default_string = Annotated[str, mapped_column(String(100))]

class User(Base):
__tablename__ = "sample"
name: Mapped[default_string]

class Sample(Base):
__tablename__ = "sample"
value: Mapped[default_string]
location: Mapped[default_string]
Я хочу создать репозиторий, чтобы каждый из них имел единый способ взаимодействия и выполнения запросов, и я хочу использовать набор текста, чтобы подсказать, как его использовать.
Скажите:

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

T = TypeVar("T", bound=Base)

class Repository(ABC, Generic[T]):
def __init__(self, model: type[T]):
self.db = SessionLocal()
self.model = model

def list(self, skip: int = 0, limit: int = 100):
return self.db.query(self.model).offset(skip).limit(limit).all()
Я использую их как:

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

class SampleRepository(Repository[Sample]):
def get_by_name(self, name: str) -> list[Sample]:
return self.model.query.filter(name=name).all()

repository = SampleRepository(Sample)
Теперь дело в том, что в хранилище.create(), что является довольно сложной логикой, мне нужно будет иметь разные подписи для разных аргументов модели. В этом случае я подумал использовать распаковку dict

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

class Repository(ABC, Generic[T]):
...
def create(self, **data) -> T:
instance = self.model(**data)
self.db.add(instance)
self.db.commit()
self.db.refresh(instance)
return instance
Но если я попытаюсь перегрузить этот метод в SampleRepository как таковой:

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

class SampleRepository(Repository[Sample]):
def create(self, name: str) -> Sample:
return super().create(
name=name,
)
Это нарушается, поскольку подпись «создать» несовместима с супертипом «Репозиторий».
Есть ли способ добиться этого? или я слишком многого требую от системы типов?

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как определить сигнатуру метода в подклассе
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Как определить сигнатуру метода в подклассе
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Как определить сигнатуру метода в подклассе
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Как я могу динамически определить сигнатуру функции для pylance и т. д.?
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • При написании быстрой сортировки в Python возможно ли одновременно иметь сигнатуру метода быстрой сортировки (arr) -> vo
    Anonymous » » в форуме Python
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous

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