2016-02-05 53 views
1

Pythionans奇怪的super()方法返回行爲使用臨時變量時,存儲超返回值

爲什麼這兩個函數返回不同的值使用一個臨時返回結果是什麼時候?

我從來沒有見過這種行爲,需要理解爲什麼。 任何線索或想法?

def _store_get_values(self, cr, uid, ids, fields, context=None): 
    return super(pai, self)._store_get_values(cr, uid, ids, fields, context) 

返回

[(10, 'pai', [13484L], ['line_next_approver_id', 'next_approver_id', 'line_id', 'partner_id'])]

而且

def _store_get_values(self, cr, uid, ids, fields, context=None): 
    result = super(pai, self)._store_get_values(cr, uid, ids, fields, context) 
    return result 

返回

[(10, 'pai', [13485L], ['line_id', 'next_approver_id', 'partner_id', 'line_next_approver_id'])]

我有這樣的的OpenERP/odoo框架。但我相信,這有沒有關係框架的邏輯,但與Python方式

+2

我不相信Python本身在這裏扮演一些角色。這將是*真的*很奇怪。我認爲'_store_get_values'不能保證返回值的順序(很像'set()'或'dict()')。 FWIW,數字也不同:13484 vs 13485. –

+0

這個數字是db的一個序列。但爲什麼這種行爲會導致雙向調用。總是將其稱爲樣式A或樣式B的結果相同 – progressdll

+0

它一致的事實本身可能是您不應該依賴的任意決定。 – chepner

回答

2

sourcecodebrowser.com

02486  def _store_get_values(self, cr, uid, ids, fields, context): 
02487   result = {} 
02488   fncts = self.pool._store_function.get(self._name, []) 
02489   for fnct in range(len(fncts)): 
02490    result.setdefault(fncts[fnct][0], {}) 
02491    ids2 = fncts[fnct][2](self,cr, uid, ids, context) 
02492    for id in filter(None, ids2): 
02493     result[fncts[fnct][0]].setdefault(id, []) 
02494     result[fncts[fnct][0]][id].append(fnct) 
02495   result2 = [] 
02496   for object in result: 
02497    k2 = {} 
02498    for id,fnct in result[object].items(): 
02499     k2.setdefault(tuple(fnct), []) 
02500     k2[tuple(fnct)].append(id) 
02501    for fnct,id in k2.items(): 
02502     result2.append((fncts[fnct[0]][4],object,id,map(lambda x: fncts[x][1], fnct))) 
02503   result2.sort() 
02504   return result2 

此代碼似乎code golf challenge的結果,但是... result2.append(...)是生產線你的結果。讓我們來仔細看看吧:

result2.append((
    fncts[fnct[0]][4], 
    object, 
    id, 
    map(lambda x: fncts[x][1], fnct) 
)) 

map()結果是給你的問題的列表。 map()返回的物品順序取決於fnct中物品的順序。

什麼是fnct?它來自k2k2是從result[object]生成的。 resultids2生成。 ids2是致電fncts[fnct][2]的結果。 fncts取自self.pool._store_function

所以,看看你的_store_function的來源,你會找到答案。