Python __repr__和None

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表达式,其求值为一个相等的对象.这对于内置类型如:intstr:

>>> 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在您的对象中是有意义的.这正是做什么listdict做什么:

>>> 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)


Tim*_*all 8

我试图找到一个__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因此显示将保持一致。