Skip to content

Instantly share code, notes, and snippets.

@jace
Created April 1, 2021 15:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jace/ecdc699548913cdd8f966f3cd226c333 to your computer and use it in GitHub Desktop.
Save jace/ecdc699548913cdd8f966f3cd226c333 to your computer and use it in GitHub Desktop.
"""Test whether a descriptor's __set_name__ is called in multiple scenarios."""
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base, declared_attr
Base = declarative_base()
db = SQLAlchemy()
class Descriptor:
def __init__(self):
self.name = 'name-not-set'
def __set_name__(self, owner, name):
self.name = name
def __get__(self, obj, cls=None):
return self
class Metaclass(type):
def __new__(cls, name, bases, dct):
return super().__new__(cls, name, bases, dct)
class SimpleClass:
attr = Descriptor()
class WithMetaclass(metaclass=Metaclass):
attr = Descriptor()
class BaseModel(Base):
__tablename__ = 'base_model'
id = Column(Integer, primary_key=True)
attr = Descriptor()
class FlaskModel(db.Model):
__tablename__ = 'flask_model'
id = Column(Integer, primary_key=True)
attr = Descriptor()
class SubBaseModel(SimpleClass, Base):
__tablename__ = 'sub_base_model'
id = Column(Integer, primary_key=True)
class SubFlaskModel(SimpleClass, db.Model):
__tablename__ = 'sub_flask_model'
id = Column(Integer, primary_key=True)
class Mixin:
@declared_attr
def attr(cls):
return Descriptor()
class MixinBaseModel(Mixin, Base):
__tablename__ = 'mixin_base_model'
id = Column(Integer, primary_key=True)
class MixinFlaskModel(Mixin, db.Model):
__tablename__ = 'mixin_flask_model'
id = Column(Integer, primary_key=True)
if __name__ == '__main__':
instances = [
SimpleClass(),
WithMetaclass(),
BaseModel(),
FlaskModel(),
SubBaseModel(),
SubFlaskModel(),
MixinBaseModel(),
MixinFlaskModel(),
]
for i in instances:
print(i.__class__.__name__, i.attr.name)
@jace
Copy link
Author

jace commented Apr 1, 2021

Output:

SimpleClass attr
WithMetaclass attr
BaseModel attr
FlaskModel attr
SubBaseModel attr
SubFlaskModel attr
MixinBaseModel name-not-set
MixinFlaskModel name-not-set

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment