__init __ () получил неожиданный аргумент ключевого слова при определении подкласса с помощью sqlalchemy - PullRequest
0 голосов
/ 25 февраля 2020

Я относительно новый пользователь sqlalchemy и у меня странная проблема, связанная с пересечением определений схемы и шаблонов. У меня есть повторяющийся шаблон в большой схеме, которая имеет версии с атрибуцией пользователя и history_tables. Поэтому я пытаюсь определить абстрактный базовый класс для обработки всех версий. Имена столбцов этой информации обычно, но не всегда одинаковы, поэтому у меня есть следующее

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import *

Base = declarative_base(name="Base")

class VersionedItem(Base):
    __abstract__ = True
    def __init_subclass__(cls,user_col="user_id", user_rel="user", history_suffix="_h", 
                          version_col='version_num', **kwarg):
        setatter(cls, user_rel+"_id", Column(user_col, Integer, ForeignKey('user.user_id')))
        setatter(cls, user_rel, relationship('User'))
        cls.version = Column(version_col, Integer, nullable=False)
        super().__init_subclass__(**kwarg)
        cls.__history_tablename__ = cls.__tablename__ + history_suffix
        # garbage to do with perevous version finding
    last_update = Column('last_update', Datetime, nullable=False)
    # more garbage to do with perevous version finding

class NormalData(VersionedItem):
    __tablename__ = "datatable"
    id = Column("NormalData_id", Integer, primary_key=True)
    # data columns

# explotion below
class User(VersionedItem, user_col="authoriser", user_rel="authoriser"):
    __tablename__ = "users"
    user_id = Column("user_id", Integer, primary_key=True)
    username = Column("username", String(32))
    # more user information

, если я запускаю это, первый дочерний класс работает, второй, однако, всплывает с ошибкой:

...
    class User(VersionedItem, user_col='authoriser', user_rel='authoriser'):
TypeError: __init__() got an unexpected keyword argument 'user_col'

Я проверил в отладчике, и метод init_subclass , кажется, успешно завершен. Я попытался определить методы прохода через init (* args, ** kargs) в User и VersionedItem, чтобы перехватить отладчик и вывести их аргументы; ни один из них не вызывается.

Python версия интерпретатора: 3.7.6 (x64) версия sqlalchemy: 1.3.8

Я бы даже оценил направление, насколько я понимаю, нет init метод должен быть вызван даже в этот момент, не говоря уже о методе, который отсутствует в текущем классе.

...