6

拡張機能を本当にきれいに見せるために、Python で ">>" 演算子をクラス メソッドとして実装しようとしています。どうすればいいのかわかりません。クラス自体を実際に操作しているので、インスタンスを作成する必要はありません。

>>> class C:
...     @classmethod
...     def __rshift__(cls, other):
...         print("%s got %s" % (cls, other))
...
>>> C.__rshift__("input")
__main__.C got input
>>> C() >> "input"
__main__.C got input
>>> C >> "input"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for >>: 'classobj' and 'str'

背景情報:

ビューを peewee ORM (Django に類似) に実装しようとしています。Peewee では、次のように、データベース テーブルとそれらの関係をクラスとして定義できます。

class Track(Model):
    title = CharField()
    artist = ForeignKeyField(Artist)

class Artist(Model):
    name = CharField(unique = True)
    location = ForeignKeyField(Location)

class Location(Model):
    state = CharField(size = 2)
    city = CharField()

注: わかりやすくするために、順序を逆にしています。

ビューの実装でこれを拡張しようとしています。最も難しい部分の 1 つは、結合を示す明確な方法を設定することです。これまでのところ、次のことを実装しました。

class Song(View):
    title = Track.title
    artist = Track.artist >> "name"
    state = Track.artist >> "location" >> "state"

これは問題ありませんが、「。」を削除したいと思います。さらに単純化するには:

class Song(View):
    title = Track >> "title"
    artist = Track >> "artist" >> "name"
    state = Track >> "artist" >> "location" >> "state"

どちらを使用しますか?または両方?

補足として、後方結合を示す良い方法を考えられる人はいますか? 次のようなものは、私にとって少し厄介です。

class LocWithSong(View):
    state = Location >> "state"
    title = Location >> Track.title
4

1 に答える 1

9

メタクラスでメソッドを定義します。

class MC(type):
  def __rshift__(self, other):
    return something(self, other)

class C(object):
  __metaclass__ = MC

print C >> None
于 2012-05-27T10:24:55.113 に答える