2015-09-24 43 views
-3

当我使用下面的代码,它工作正常:为什么上下文=无?

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

但是,当我使用下面的代码,它抛出一个错误:

'NoneType' object is not iterable.

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

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

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

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

此外为什么context=None在参数。

+1

你问我们为什么你写了'context = None'? – interjay

+0

你为什么要进行递归调用来写?你确定要这么做,或者你想覆盖它吗? – forvas

+0

你的问题不清楚,两个函数下面的参数和名字完全相同,似乎是一个坏主意。 –

回答

4

有两种不同的东西

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

它的方法定义,在您指定的默认值parameteres的,它的时候你是不是通过这个参数与方法调用它会采取默认手段该参数的值为

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和相同的值将传递客场写方法,这样它不会给你一个错误。

context = context表示上下文在调用时具有分配给上下文参数的值,可以是也可以不是NONE。尝试通过没有通过XYZ调用会给你同样的错误。

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

在其次,你总是不传递任何写入方法而不是context = context,所以除了none外没有其他的机会。

一般来说,当你调用任何方法时,永远不会将None传递给上下文简单地设置{}(空字典),它至少不会给你错误。

最后,为什么你得到这个错误是因为在写入方法的某处,CONTEXT(实际上是通过NONE)用于该模型。如果你想知道原因,那么你需要找出所有的地方写模式被重写为该模型,并在哪里使用上下文。

+0

Paragon回答。完善。 –

0

你没有向我们展示你在哪里调用这些函数,很可能你用一些可迭代的上下文调用xyz。这就是为什么在第一种情况下,上下文不是无和它的作品。而在第二种情况下,您不保留在参数中收到的上下文,并发送硬编码值None,哪些课程不可迭代。无论如何,你想要完成什么?你必须做的是类似 -

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

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

+0

在第一种情况下请参阅context = None,所以在write方法上下文中应该是None,然后它仍然可以正常工作。 –

+0

@Ravi它是一个默认参数,如果你在函数调用中传递另一个值,那么默认参数没有被使用。 – hspandher

+0

我改变了我的答案,看看你现在得到它 – hspandher

相关问题