Я пытаюсь создать вложенные классы Python, используя функцию type
с тремя аргументами.Я хочу построить аналог этого:
In [15]: class CC:
...: class DD:
...: pass
...:
Наивная попытка
In [17]: AA = type('AA', (), {'BB': type('BB', (), {})})
, но это не совсем верно, поскольку BB
фактически создается снаружи и до AA
и только помещается внутрь `AA позже.
Различие демонстрируется следующим образом:
In [18]: AA.BB
Out[18]: __main__.BB
In [16]: CC.DD
Out[16]: __main__.CC.DD
Как я могу создавать вложенные классы отражательно / динамически, которые полностью эквивалентны вложенным определениям?
Я хочу использовать это для рефлексивного генерирования API graphene-sqlalchemy
.Существует идиома создания внешнего класса Graphene с внутренним Meta-классом, указывающим на соответствующий класс модели SQLAchemy (http://docs.graphene -python.org / projects / sqlalchemy / en / latest / tutorial / # schema )Например:
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class UserModel(Base):
__tablename__ = 'department'
id = Column(Integer, primary_key=True)
name = Column(String)
last_name = Column(String)
from graphene_sqlalchemy import SQLAlchemyObjectType
class User(SQLAlchemyObjectType):
class Meta:
model = UserModel
# only return specified fields
only_fields = ("name",)
# exclude specified fields
exclude_fields = ("last_name",)
Класс User
, приведенный выше, довольно приятен для печенья и должен быть программно из класса UserModel
.Это должно быть выполнимо для всей схемы.