2017-11-09 7 views
1

SQL条件用のラッパーを作成しています(whereステートメントでラッパーも使用できるように)。python - オーバーロード演算子を使用したSQL条件オブジェクトの作成

アイデアは、それらのすべてが有効であるということです。今のところ大丈夫です

>> condition_a = Condition("x","=","5") 
>> condition_b = Condition("y",">","6") 
>> c = condition_a & condition_b 
which should give me " x = 5 AND y > 6 " 

- 私は、およびまたはに過負荷をかけることによって行うことができます。

私は(はこのような作業を持っているをオーバーロードすべきかを知らないのですか?私の条件クラスの

>> condition_a = Condition("x","=","5") 
>> condition_b = Condition("y",">","6") 
>> condition_c = Condition("z",">","7") 
>> d = condition_c & (condition_a | condition_b) 
which should give me " z > 7 AND (x = 5 OR y > 6) " 

Sceletonは次のとおりです。

class Condition(object) : 
    def __init__(self , args) : 
     .... 

    def __and__(self , other) : 
     ... 

    def __or__(self , other) : 
     ... 

私はそれをどのように行うことができますか?

+0

そうでもない重複しますが、HTTPSを見てみましょう: //stackoverflow.com/questions/15719172/overload-operator-in-python – Bahrom

+0

IMO 'condition_a | condition_b'は、後続の計算に対するオペランドと同じような新しい「ConditionGroup」オブジェクトをもたらすはずである。 – georgexsh

+0

@georgexsh私はこの問題をatmしていると思うので、例を挙げることができます – ghostrider

答えて

2

(をオーバーロードする必要はありません。そうすることはできません。

あなたはSQL文を生成しているように、私は余分な括弧を推測が許容され、かつよりエラーを起こしやすい:

class Condition(object) : 
    def __init__(self , *args) : 
     self.args = args 

    def __str__(self): 
     return '({})'.format(' '.join(map(str, self.args))) 

    def __and__(self , other) : 
     return Condition(self, 'and', other) 

    def __or__(self , other) : 
     return Condition(self, 'or', other) 

condition_a = Condition("x","=","5") 
condition_b = Condition("y",">","6") 
condition_c = Condition("z",">","7") 
d = condition_c & (condition_a | condition_b) 
print(d) 

利回り:

((z > 7) and ((x = 5) or (y > 6))) 
関連する問題