Как устранить ошибку. Неразрешенная ссылка на атрибут «создать» для класса «BaseRepository».Python

Программы на Python
Ответить
Anonymous
 Как устранить ошибку. Неразрешенная ссылка на атрибут «создать» для класса «BaseRepository».

Сообщение Anonymous »

У меня есть код:

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

import logging
from typing import Generic, TypeVar
from typing import Self, Any, Type

from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import Session

logger = logging.getLogger(__name__)

T = TypeVar('T')

class BaseRepository(Generic[T]):
model_cls: Type[T]

def __init__(self, session: Session | AsyncSession) -> None:
if not self.model_cls:
raise ValueError(f"Не задана модель в атрибуте `{self.__class__.__name__}.model_cls`")
self._session = session
self._flush = False
self._commit = False

def _clone(self) -> Self:
clone = self.__class__(self._session)
clone._flush = self._flush
clone._commit = self._commit
return clone

def flush(self) -> Self:
clone = self._clone()
clone._flush = True
return clone

def commit(self) -> Self:
clone = self._clone()
clone._commit = True
return clone

class AsyncRepository(BaseRepository):

async def create(self, **kw: Any) -> T:
obj = self.model_cls(**kw)
self._session.add(obj)
await self._flush_commit(obj)
return obj

async def _flush_commit(self, *objs: T) -> None:
if self._commit and objs:
await self._session.commit()
elif self._flush:
await self._session.flush(objs)
self._flush = False
self._commit = False

class SyncRepository(BaseRepository):

def create(self, **kw: Any) -> T:
obj = self.model_cls(**kw)
self._session.add(obj)
self._flush_commit(obj)
return obj

def _flush_commit(self, *objs: T) -> None:
if self._commit and objs:
self._session.commit()
elif self._flush:
self._session.flush(objs)
self._flush = False
self._commit = False
При следующем выполнении:

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

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker, declarative_base

Base = declarative_base()

class User(Base):
__tablename__ = 'users'

id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)

engine = create_engine('sqlite:///db.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)

class UsersRepo(SyncRepository):
model_cls = User

with Session() as session:
repo = UsersRepo(session)
repo.commit().create(name="asd", age=10)
В строке repo.commit().create(name="asd", age=10) PyCharm выдает предупреждение:
Изображение

Как исправить это предупреждение?

Подробнее здесь: https://stackoverflow.com/questions/798 ... s-baserepo
Ответить

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

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

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

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

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