Da quando ho bisogno dei valori di default non necessariamente nel costruttore, ma a volte da altri luoghi, mi si avvicinò con una funzione, che ho aggiunto alla mia classe di base Oggetto:
Base = declarative_base()
class ItemBase(Base):
__abstract__ = True
def _ensure_defaults(self):
for column in self.__table__.c:
if getattr(self, column.name) is None and column.default is not None and column.default.is_scalar:
setattr(self, column.name, column.default.arg)
che ovviamente non funziona per callable. Non riuscivo a capire come chiamarlo, e forse è per il meglio (senti come hackerare il pensiero già).
Con questa posso fare qualcosa di simile:
class User(ItemBase):
# ... inheritance, columns and stuff
def __init__(self):
self._ensure_defaults()
Posso anche chiamare il metodo non in __init__
, ma anche da altri metodi, in caso Ho solo bisogno di fare affidamento sui valori in circostanze particolari (che Ho finito per rimuovere più tardi, poiché era troppo confuso). Ancora in alcuni casi questo potrebbe essere più flessibile della soluzione di @JamesEmerton.
Vedere anche: https://stackoverflow.com/a/48097586/6646912 – krassowski