2012-03-02 6 views
5

私は最近web2pyフレームワークを見ていました。私はDjangoの以前の経験がありましたが、それ以上のプレーンなPythonを使っていましたが、web2pyが採用しているQueryシステムを理解できませんでした。 web2pyのクエリ式はどのように機能しますか?

(db.mytable.myfield > 'A')が直接真/偽に評価されないと言うのは、 web2py book

db = DAL('sqlite://storage.db') 
myquery = (db.mytable.myfield > 'A') 
myset = db(myquery) 
rows = myset.select() 
for row in rows: 
    print row.myfield 

In a SO comment web2pyの作者からこの例を見てみましょう、それが実際に選択時の行ごとに評価です。これらの式をクエリオブジェクトとして使用したり、組み合わせたりすることができるのは、これがわかっています。

私はこのオンラインでの答えを見つけようとしましたが、できませんでしたので、ここに私の質問です:それらのクエリ式はTrue/Falseにどのように評価されていませんか?なぜmyqueryの価値は、真実ではないのですか?私がおそらく欠けているPythonの機能は、これを動作させることができますか?

答えて

7

他の回答がそれを持っていますが、もう少しだけweb2pyの固有の詳細を提供するために:

db.mytable.myfield > 'A' 

db.mytable.myfieldはDAL Expressionクラスから継承web2pyのDAL Fieldクラスのインスタンスです。 Expression(したがってField)に適用した場合Expressionクラス自体は、オブジェクトがDAL Queryクラスのインスタンスではなく、標準のPython Booleanオブジェクトを返す、等==<>、としてPythonの演算子、これらのオーバーロードされた演算子の数をオーバーロード。 >__gt__)演算子の場合はsource codeです。

オペレータオーバーロードの詳細についてはhereを参照してください。 Pythonで

2

special methodsの評価に基づいて、カスタム(非組み込み)オブジェクトに適用された演算子があります。それは広くoperator overloadingとして知られています。 だから、基本的に、フィールド・クラス定義は、同様に見えた:

class DBField(...): 
#... 

    def __gt__(self,value): 
     #building query object, based on value 
     return query 
関連する問題