Pat*_*llo 4 python sqlalchemy repr
我是Python的新手,目前我需要__repr__一个SqlAlchemy类.我有一个可以接受Null值的整数列,SqlAlchemy将其转换为None.例如:
class Stats(Base):
__tablename__ = "stats"
description = Column(String(2000))
mystat = Column(Integer, nullable=True)
Run Code Online (Sandbox Code Playgroud)
__repr__当SqlAlchemy返回时,在函数中表示"mystat"字段的正确方法是什么None?
yak*_*yak 10
本__repr__应返回描述对象的字符串.如果可能,它应该是一个有效的Python表达式,其求值为一个相等的对象.这对于内置类型如:int或str:
>>> x = 'foo'
>>> eval(repr(x)) == x
True
Run Code Online (Sandbox Code Playgroud)
如果那是不可能的,那么它应该是'<...>'唯一描述该对象的字符串.默认值__repr__是这样的示例:
>>> class Foo(object):
pass
>>>
>>> repr(Foo())
'<__main__.Foo object at 0x02A74E50>'
Run Code Online (Sandbox Code Playgroud)
它使用内存中的对象地址来唯一标识它.当然,地址并没有告诉我们很多关于对象的信息,因此覆盖__repr__并返回描述对象状态的字符串很有用.
对象的状态由它包含的其他对象定义,因此将它们包含repr在您的对象中是有意义的.这正是做什么list或dict做什么:
>>> repr(['bar', Foo()])
"['bar', <__main__.Foo object at 0x02A74710>]"
Run Code Online (Sandbox Code Playgroud)
在您的情况下,状态在您的Column属性中,因此您想要使用它们repr.您可以使用此%r格式,它插入一个repr()参数:
def __repr__(self):
return '<Stats: description=%r, mystat=%r>' % (self.description, self.mystat)
Run Code Online (Sandbox Code Playgroud)
使用新格式的等效项:
def __repr__(self):
return '<Stats: description={0.description!r}, mystat={0.mystat!r}>'.format(self)
Run Code Online (Sandbox Code Playgroud)
我试图找到一个__repr__可以在任何 SQLAlchemy 对象上使用的通用方法,但只找到了这个页面。所以,我决定自己写,这是我所做的:
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
if __debug__:
# monkey-patch in useful repr() for all objects, but only in dev
def tablerepr(self):
return "<{}({})>".format(
self.__class__.__name__,
', '.join(
["{}={}".format(k, repr(self.__dict__[k]))
for k in sorted(self.__dict__.keys())
if k[0] != '_']
)
)
Base.__repr__ = tablerepr
Run Code Online (Sandbox Code Playgroud)
这扩展了Base类以打印出特定实例的内容。所以,现在我创建的每个扩展对象Base都将有一个__repr__方法,该方法打印的不仅仅是类名和实例哈希。
编辑:我添加了一个,if __debug__因为此更改可能会导致您不希望在生产环境中泄露的信息泄漏。我还添加了一个,sorted因此显示将保持一致。
| 归档时间: |
|
| 查看次数: |
8256 次 |
| 最近记录: |