2017-05-02 87 views
0

我正在寫一個基本的嘲笑框架,所以我可以測試一些調用peewee。我可以依靠在傳入python之前進行評估的參數嗎?

我知道peewee,你可以where()電話像
model.select().where(model.id == target_id). ...

爲了檢測這些被比較的模型的領域,我將覆蓋該領域的比較操作。然後我會注入該模型來代替peewee模型。它將提供與peewee模型相同的接口(儘管需要儘可能多),但不是訪問數據庫,而是記錄比較和調用;但是它將全部取決於在之前正在評估的參數,該方法被調用。

我已經運行了一個使用anaconda的示例,並且對於Linux Mint提供的任何python,它們似乎都按照我的意願操作。我不確定這是否是運行時僥倖,或者python確實可以在需要之前評估比較。

那麼,關於以下情況,我可以依靠model.id == target_id, ...運行比較,然後在第一個where()被調用?我可以依靠model.name == target_name在調用第二個where()之前運行它的比較,並且在第一個where()之後?

mockModel.select() 
     .where(model.id == target_id, model.number == target_number) 
     .where(model.name == target_name) 
     ... 
+0

參數中的表達式被完全執行到結果對象中,並且該對象被傳遞給函數。所以,是的,他們必須在通話之前完全解決。 – tdelaney

+0

好的,很酷;但這種解決有多早?包含行之前?在方法鏈中第一次調用之前?在調用任何方法之前,是否在方法鏈中評估了所有表達式? –

回答

0

方法參數在調用時被解析。由於在調用第一個where時尚未查找第二個where,因此其參數尚未解決。對於這一說法

mockModel.select()\ 
     .where(model.id == target_id, model.number == target_number)\ 
     .where(model.name == target_name) 

的順序是

  • 查找mockModel
  • 查找select該對象上
  • 它沒有參數,所以調用它,得到它的結果對象
  • 查找where對結果對象
  • 其功能如此評估其參數左至右
  • 通話功能和結果對象
  • 其函數調用上得到它的結果對象
  • 查找where,使評估其參數左至右
  • 通話功能
0

是的。從docs

主要結果必須爲可調用對象(用戶定義的函數,內置函數,方法內置對象,類對象,類實例的方法,以及具有__call__()所有對象方法可調用)。 在嘗試調用之前評估所有參數表達式。

+0

所以,可以肯定的是,就這個例子而言,'model.name == target_name'將在第一個'where()'後面運行'__eq __(self,other)',但是_before_第二個'where() '? –

+0

@ D.Joe:是的,沒錯。 – user2357112

相關問題