2012-10-26 38 views
1

我似乎無法找出爲什麼「或」的行爲是這樣。我使用的SQLAlchemy和WTForms.ext.sqlalchemy.QuerySelectFieldQuerySelectField可以有query_factory集,但如果缺少它應該回落到田間地頭query方法:Python/SQLAlchemcy「或」功能

例如

class Form1(Form): 
    fielda = QuerySelectField('Field A') 

您還可以設置query_factory參數,像這樣:

class Form1(Form): 
    fielda = QuerySelectField('Field A', query_factory=somefunction) 

然後在其他地方使用的形式,像這樣:

form = Form1(request.form) 
form.fielda.query = MyObjects.query.all() 

我所看到的是,如果MyObjects.query.all()返回一個空列表,我在QuerySelectField _get_object_list()方法的這一行中得到一個NoneType not callable異常:

query = self.query or self.query_factory() 

基本上,不管什麼self.query值時,or依舊在呼喚,即使它被分配給Noneself.query_factory()

所以,我的問題是,這是預期的行爲or?看起來,它評估兩者和然後它決定是否需要使用第二個值,如果第一個是None。它是否正確?

+0

你確定它的'或'那的呼喚'self.query_factory()'在這裏嗎?你確定沒有別的東西叫'self.query_factory()'嗎? – inspectorG4dget

回答

0

可以簡潔地陳述的or的行爲:

如果左邊的對象是真喜歡,它返回左邊的對象,否則返回正確的對象。


在這種情況下,剩下的對象是假像(None),所以它需要調用的函數,以獲得正確的對象返回。

+2

實際上,如果左邊的對象爲false,它會將對象返回到右邊。例如:'0'或'''返回'''','0'或'a''返回'a'。 –

+0

@ThomasOrozco - 正確。我已更新。 – mgilson

1

or短路。這意味着,

query = self.query or self.query_factory() 

如下評價:

  1. 檢查self.query計算結果爲False。如果不是,則self.query引用的對象綁定到queryself.query_factory()在這種情況下不叫
  2. 如果它是 a False y值(包括None),那麼調用self.query_factory()並將其結果綁定到query
+0

我在測試中沒看到這個。當我運行它時,無論self.query(None或positive value)的值如何,self.query_factory()總是被評估。 –

+0

那麼肯定還有別的東西在調用那個方法。嘗試'def test():打印「Bzzt!」,然後執行'1或test()'與'0或test()'或'None或test()'。 –