gpt4 book ai didi

python - SQLAlchemy为大型表定义__repr__的最佳方法

转载 作者:行者123 更新时间:2023-12-02 00:53:54 26 4
gpt4 key购买 nike

我在SQLAlchemy中有一堆表要定义__repr__

标准约定看起来像这样:

def __repr__(self):
return "<TableName(id='%s')>" % self.id

对于小 table 来说,这一切都很好。但是,我有40多个列的表。 有没有更好的方法来构造__repr__,这样我就不必手动键入大字符串了?

我存放所有表的文件称为 models.py。我想到的一个解决方案是在 _create_repr_string中创建一种 models.py方法,该方法负责自动生成字符串以使 __repr__返回。我想知道是否有更标准的方法来创建 __repr__

最佳答案

在导航日志文件和堆栈跟踪时,为复杂对象使用良好的__repr__可能会非常有用,因此,您尝试为此提供一个良好的模式非常好。

我喜欢有一个默认的小助手(在本例中,初始化model_class时,BaseModel被设置为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='foo@bar.com')>,blah='hi')>

关于python - SQLAlchemy为大型表定义__repr__的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55713664/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com