使用临时变量存储 super return 值时出现奇怪的 super () return 行为
Strange super () return behaviour when using a temp variable to store the super return value
腐霉菌
为什么这两个函数 return 在使用临时 return 结果时会有不同的值?
我以前从未见过这种行为,需要了解原因。
有什么线索或想法吗?
def _store_get_values(self, cr, uid, ids, fields, context=None):
return super(pai, self)._store_get_values(cr, uid, ids, fields, context)
Returns
[(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
Returns
[(10, 'pai', [13485L], ['line_id', 'next_approver_id', 'partner_id', 'line_next_approver_id'])]
我在 openerp/odoo 框架中有这个。但我相信这与框架逻辑无关,而是与 Python 方式
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
?它来自 k2
。 k2
是从 result[object]
生成的。 result
是从 ids2
生成的。 ids2
是调用 fncts[fnct][2]
的结果。 fncts
取自 self.pool._store_function
.
所以,查看您的 _store_function
来源,您会找到答案。
腐霉菌
为什么这两个函数 return 在使用临时 return 结果时会有不同的值?
我以前从未见过这种行为,需要了解原因。 有什么线索或想法吗?
def _store_get_values(self, cr, uid, ids, fields, context=None):
return super(pai, self)._store_get_values(cr, uid, ids, fields, context)
Returns
[(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
Returns
[(10, 'pai', [13485L], ['line_id', 'next_approver_id', 'partner_id', 'line_next_approver_id'])]
我在 openerp/odoo 框架中有这个。但我相信这与框架逻辑无关,而是与 Python 方式
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
?它来自 k2
。 k2
是从 result[object]
生成的。 result
是从 ids2
生成的。 ids2
是调用 fncts[fnct][2]
的结果。 fncts
取自 self.pool._store_function
.
所以,查看您的 _store_function
来源,您会找到答案。