为什么Context = None?

时间:2015-09-24 10:57:37

标签: python odoo-8

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

scrollPane.setBorder(new LineBorder(new Color(192,192,192)));

但是,当我使用以下代码时,它会抛出一个错误:

  

' NoneType'对象不可迭代。

def xyz(self, cr, uid, ids, vals, context=None):
    .......
    .......
    self.write(cr, uid, ids, vals, context=context) 

两种方法都有相同的参数,但写方法不同。

我没有更新代码中的上下文。

但是第二个会抛出一个错误,为什么?

此外,为什么def xyz(self, cr, uid, ids, vals, context=None): ....... ....... self.write(cr, uid, ids, vals, context=None) 在论证中。

2 个答案:

答案 0 :(得分:4)

有两件不同的事情

def xyz(self, cr, uid, ids, vals, context=None):

它的方法定义,您在其中指定参数的默认值,这意味着当您没有通过方法调用传递该参数时,它将采用默认值< / strong>用于该参数。

Click here了解更多

self.write(cr, uid, ids, vals, context=None)

此案例定义您在上下文中传递。这是关键字参数的概念。

Click here了解更多

def xyz(self, cr, uid, ids, vals, context=None):
    .......
    .......
    self.write(cr, uid, ids, vals, context=context) 

它表明只有当没有将上下文值传递给该方法 XYZ 时才会在上下文中采用默认值,并且相同的值将转移到write方法所以它不会给你一个错误。

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传递给上下文,只需设置{}(空白字典),它至少不会给你错误。

最后,为什么你得到这个错误是因为在某处的写入方法CONTEXT(实际上是传递NONE)用于该模型。如果你想知道原因,那么你需要找出所有的地方,其中为该模型覆盖了write方法,以及在哪里使用上下文。

答案 1 :(得分:0)

你没有告诉我们你在哪里调用这些函数,很可能你用一些可迭代的上下文调用xyz。这就是为什么在第一种情况下,上下文不是None而且它有效。而在第二种情况下,您不保留在参数中接收的上下文并发送硬编码值None哪个是不可迭代的。无论如何,你究竟想要完成什么?你必须做的事情就像 -

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

在第一种情况下,此context不会是None