1 回答

TA貢獻1865條經驗 獲得超7個贊
在__repr__導航日志文件和堆棧跟蹤時,對復雜對象具有良好功能可能非常有用,因此您嘗試為它提出一個好的模式真是太好了。
我喜歡有一個默認的小助手(在我的例子中,BaseModel 被設置為model_class初始化flask-sqlalchemy時)。
import typing
import sqlalchemy as sa
class BaseModel(Model):
def __repr__(self) -> str:
return self._repr(id=self.id)
def _repr(self, **fields: typing.Dict[str, typing.Any]) -> str:
'''
Helper for __repr__
'''
field_strings = []
at_least_one_attached_attribute = False
for key, field in fields.items():
try:
field_strings.append(f'{key}={field!r}')
except sa.orm.exc.DetachedInstanceError:
field_strings.append(f'{key}=DetachedInstanceError')
else:
at_least_one_attached_attribute = True
if at_least_one_attached_attribute:
return f"<{self.__class__.__name__}({','.join(field_strings)})>"
return f"<{self.__class__.__name__} {id(self)}>"
現在你可以讓你的__repr__方法保持整潔:
class MyModel(db.Model):
def __repr__(self):
# easy to override, and it'll honor __repr__ in foreign relationships
return self._repr(id=self.id,
user=self.user,
blah=self.blah)
應該產生類似的東西:
<MyModel(id=1829,user=<User(id=21, email='[email protected]')>,blah='hi')>
添加回答
舉報