質問

https://storm.canonical.com/Tutorial でStorm ORMのチュートリアルを読みました。私は次のコードにつまずいた:


store.find(Person, Person.name == u"Mary Margaret").set(name=u"Mary Maggie")

find メソッドの2番目の引数がTrue / Falseに評価されるかどうかはわかりません。ラムダとして解釈されると思います。それが本当なら、どのように私の機能で同じ効果を達成できますか?

役に立ちましたか?

解決

私はJavaプログラマーなので...推測しています... オペレーターのオーバーロードですか? Person.name ==は、代わりに比較を行うオーバーロードされた演算子です... SQLクエリを生成します

my 0.02 $

他のヒント

Person.name には、ブール値ではなく式の両側を格納するオブジェクトを返すオーバーロードされた __ eq __ メソッドがあります。そのオブジェクトを find()メソッドで調べて、フィルタリングに使用する属性と値を取得できます。これを遅延評価パターンの一種として説明します。

Stormでは、 比較可能オブジェクト

Person.name は、カスタムの __ eq __ メソッドを持つあるタイプのインスタンスです。通常、 __ eq __ はboolean(ish)値を返しますが、実際にはラムダを含む必要なものを何でも返すことができます。このメソッドと関連メソッドの詳細については、 Pythonの特別なメソッド名をご覧ください。 。

おそらくこれの中で最も紛らわしい/誤解を招く部分(特にJavaのような他のオブジェクト指向言語に慣れている場合)は、 Person.name person.name (ここで、 person Person のインスタンスです)相互に関係を持つ必要はありません。例:

class Person(object):
  name = "name of class"
  def __init__(self):
    self.name = "name of instance"

person = Person()
print Person.name
print person.name

これにより印刷されます:

name of class
name of instance

クラスプロパティはクラス本体で設定されるだけで、インスタンスプロパティは __ init __ メソッドで設定されることに注意してください。

あなたの場合、ラムダを返すカスタムの __ eq __ メソッドを使用して、 Person.name をオブジェクトに設定します:

class LambdaThingy(object):
  def __init__(self, attrname):
    self.__attrname = attrname

  def __eq__(self, other):
    return lambda x: getattr(x, self.__attrname) == other

class Person(object):
  name = LambdaThingy('name')

  def __init__(self, name):
    self.name = name

equals_fred = Person.name == "Fred"
equals_barney = Person.name == "Barney"

fred = Person("Fred")

print equals_fred(fred)
print equals_barney(fred)

これは印刷します:

True
False

これは確かに「あまりにも賢い」というエッジを回避しているので、本番コードでこれを使用することには非常に慎重になります。明示的なラムダは、それがもう少し冗長であっても、おそらく将来のメンテナーにとってずっと明確になるでしょう。

魔法はPerson.nameプロパティにあり、 __ eq __ (& c)をオーバーロードして非ブールを返す型になります。 Stormのソースは、 http://bazaar.launchpad.net/~storm/storm/trunk/files/head%3A/storm/ -ご覧のように、&quot ;黒魔術&quot ;;-)

それは私にはPythonラムダのようには見えません。 Stormのコードは読んでいませんが、Milesは遅延評価スキーマを使用しているという点でおそらく正しいでしょう。

pythonラムダ関数の詳細については、章 = "http://www.diveintopython.org/index.html" rel = "nofollow noreferrer"> Dive Into Python 。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top