Python 为什么上下文=无?

Python 为什么上下文=无?,python,odoo-8,Python,Odoo 8,当我使用以下代码时,它工作正常: def xyz(self, cr, uid, ids, vals, context=None): ....... ....... self.write(cr, uid, ids, vals, context=context) 但当我使用以下代码时,它会抛出一个错误: “NoneType”对象不可编辑 两个方法的参数相同,但write方法不同 我没有在两个代码中更新上下文 但第二个会出错,为什么 此外,为什么参数中的context=No

当我使用以下代码时,它工作正常:

def xyz(self, cr, uid, ids, vals, context=None):
    .......
    .......
    self.write(cr, uid, ids, vals, context=context) 
但当我使用以下代码时,它会抛出一个错误:

“NoneType”对象不可编辑

两个方法的参数相同,但write方法不同

我没有在两个代码中更新上下文

但第二个会出错,为什么


此外,为什么参数中的context=None。

您没有向我们展示您在哪里调用这些函数,很可能您正在使用一些可编辑的上下文调用xyz。这就是为什么在第一种情况下,上下文不是空的,而是有效的。而在第二种情况下,您并没有保留参数中接收到的上下文并发送硬编码的值None,这当然是不可编辑的。不管怎样,你到底想完成什么?你一定在做什么-

xyz(..., context = []) # that's why context is iterable in first case and not second

在第一种情况下,这个上下文不会是空的。

有两种不同的东西

def xyz(self, cr, uid, ids, vals, context=None):
它是一个方法定义,在其中指定参数的默认值,这意味着当您不通过方法调用传递该参数时,它将采用该参数的默认值

看更多

self.write(cr, uid, ids, vals, context=None)
def xyz(self, cr, uid, ids, vals, context=None):
    .......
    .......
    self.write(cr, uid, ids, vals, context=context) 
本例定义在上下文中不传递任何消息。这是关键字参数的概念

看更多

self.write(cr, uid, ids, vals, context=None)
def xyz(self, cr, uid, ids, vals, context=None):
    .......
    .......
    self.write(cr, uid, ids, vals, context=context) 
它表明,只有当您没有将上下文值传递给该方法XYZ时,才会在上下文中使用默认值none,并且相同的值将传递给write方法,这样它就不会给您错误

context=context意味着context具有在调用时分配给context参数的值,可能没有,也可能没有。尝试在XYZ调用中传递none将产生相同的错误

def xyz(self, cr, uid, ids, vals, context=None):
    .......
    .......
    self.write(cr, uid, ids, vals, context=None)
在第二种情况下,您总是将none传递给write方法,而不是context=context,因此除了none之外没有其他可能

通常,当您调用任何方法时,都不会向上下文传递None,只需设置{}空白字典,它至少不会给您错误


最后,之所以会出现这个错误,是因为在write方法中,上下文实际上被传递了,而该模型没有使用任何上下文。如果您想知道原因,那么您需要找出该模型重写write方法的所有位置以及上下文的使用位置。

您问我们为什么要编写context=None?为什么要递归调用write?您确定要这样做还是试图覆盖它?您的问题不清楚,而且两个参数和名称完全相同的函数位于彼此下方似乎是个坏主意。请查看其他模块源代码中的一些示例,了解如何编程这些方法。你必须调用父方法请正确阅读问题我问了你两件事来回答1为什么我们在大多数方法中使用context=None?2两个代码都有相同的签名,但错误是由上下文变量引起的。请参见参数中的第一种情况context=None,因此,在write方法中,context应该是None,但仍然可以正常工作。@Ravi它是默认参数,以防在函数调用中传递另一个值,现在我改变了我的答案,看看你现在是否得到它,你的意思是说,如果我们指定上下文=没有,它会考虑上下文= [],如果我用Self.WrreCr,UID,IDS,VALL,上下文= []改变第二次写,它会正常工作吗?不,这不是我的意思,告诉我们你是如何调用XYZ的,这导致了例外典范的答案。完美的