5

私はPythonにまったく慣れていないので、現在__repr__SqlAlchemyクラス用のを持っている必要があります。値を受け入れることができる整数列がNullあり、SqlAlchemyはそれをに変換しNoneます。例えば:

class Stats(Base):
   __tablename__ = "stats"
   description = Column(String(2000))
   mystat = Column(Integer, nullable=True)

__repr__SqlAlchemyが戻ったときに関数の「mystat」フィールドを表す正しい方法は何Noneですか?

4

6 に答える 6

11

__repr__、オブジェクトを説明する文字列を返す必要があります。可能であれば、等しいオブジェクトに評価される有効なPython式である必要があります。intこれは、またはのような組み込みタイプに当てはまりますstr

>>> x = 'foo'
>>> eval(repr(x)) == x
True

それが不可能な場合は'<...>'、オブジェクトを一意に説明する文字列にする必要があります。デフォルト__repr__はこの例です:

>>> class Foo(object):
        pass
>>>
>>> repr(Foo())
'<__main__.Foo object at 0x02A74E50>'

メモリ内のオブジェクトのアドレスを使用して、オブジェクトを一意に識別します。もちろん、アドレスはオブジェクトについてあまり教えてくれないので__repr__、オブジェクトの状態を説明する文字列をオーバーライドして返すと便利です。

オブジェクトの状態は、オブジェクトに含まれる他のオブジェクトによって定義されるため、オブジェクトを自分のオブジェクトに含めるのは理にかなっていますrepr。これはまさに何をするlistdictです:

>>> repr(['bar', Foo()])
"['bar', <__main__.Foo object at 0x02A74710>]"

あなたの場合、状態はあなたのColumnプロパティにあるので、あなたはそれらを使用したいと思いますrepr%rこれにはフォーマットを使用できますrepr()。引数のaが挿入されます。

def __repr__(self):
    return '<Stats: description=%r, mystat=%r>' % (self.description, self.mystat)

新しいフォーマットを使用した場合と同等です。

def __repr__(self):
    return '<Stats: description={0.description!r}, mystat={0.mystat!r}>'.format(self)
于 2011-10-13T15:55:26.180 に答える
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

Baseこれにより、クラスが拡張され、特定のインスタンスのコンテンツが出力されます。したがって、これで、を拡張するすべてのオブジェクトに、クラス名とインスタンスハッシュ以外のものを出力Baseするメソッドが含まれるようになります。__repr__

編集:if __debug__この変更により、本番環境では漏洩したくない情報が漏洩する可能性があるため、を追加しました。sortedまた、表示が一貫するように追加しました。

于 2013-04-10T15:08:02.290 に答える
3

sqlalchemy-utilsのgeneric_reprデコレータは、ニーズに合ったコミュニティベースのソリューションを提供していませんか?

なしのままにします。

于 2018-05-22T16:30:12.227 に答える
0

多分repr(mystat)あなたが欲しいものですか?

于 2011-10-13T15:36:01.177 に答える
0

mystatがNoneの場合は「Null」それ以外の場合はmystat

于 2011-10-13T15:40:29.023 に答える
0

オーバーライドする方法を示す前の答えBase.__repr__は、まさに私が必要としていたものでした。ありがとうございました!ここでは、Python 3.7以降のf-stringで書き直され、flask-sqlalchemyがオーバーライドされますdb.Model

def override_default_repr(self):
    class_name = self.__class__.__name__
    attribs = ", ".join(
        [
            f"{k}={self.__dict__[k]!r}"
            for k in sorted(self.__dict__.keys())
            if k[0] != "_"
        ]
    )
    return f"<{class_name}({attribs})>"

db.Model.__repr__ = override_default_repr
于 2020-06-04T03:13:16.470 に答える