【问题标题】:Why Context = None?为什么上下文 = 无?
【发布时间】:2015-09-24 10:57:37
【问题描述】:

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

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

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

'NoneType' 对象不可迭代。

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

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

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

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

而且为什么context=None在争论中。

【问题讨论】:

  • 你问我们为什么写context=None
  • 你为什么要递归调用 write?您确定要这样做还是试图覆盖它?
  • 你的问题不是很清楚,下面的两个函数参数和名称完全相同似乎是个坏主意..
  • 查看其他模块源代码中的一些示例,了解如何编写这些方法。你必须调用父方法
  • 请正确阅读问题我问了你两件事来回答 1) 为什么我们在大多数方法中使用 context=None? 2)两个代码具有相同的签名,但错误是由于上下文变量。

标签: python odoo-8


【解决方案1】:

有两种不同的东西

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

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

Click here查看更多

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

这种情况定义您传递的是 None in context。这是关键字参数的概念。

Click here查看更多

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

它表明它将在上下文中默认为 none 仅当您没有将上下文值传递给该方法 XYZ 并且相同的值将传递给 write 方法这样它就不会给你一个错误。

context=context 表示上下文具有在调用时分配给上下文参数的值,可能是也可能不是 NONE。尝试在 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 传递给上下文,只需设置 {}(空白字典),它至少不会给您错误。

最后,为什么您会收到此错误,是因为在某处的写入方法中,该模型使用了 CONTEXT(实际上是通过 NONE)。如果您想知道原因,那么您需要找出所有这些地方都为该模型重写了 write 方法,以及在哪里使用了上下文。

【讨论】:

  • 典范回答。完美。
【解决方案2】:

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

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

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

【讨论】:

  • 在第一种情况下查看参数中的 context=None 因此,在 write 方法中 context 应该是 None 间接然后它仍然可以正常工作。
  • @Ravi 这是一个默认参数,如果你在函数调用中传递另一个值,那么默认参数不会被使用。
  • 我的答案已经改了,看看你现在明白了吗
  • 你的意思是说,如果我们指定 context = None 它会考虑 context = [] ,所以如果我用 self.write(cr, uid, ids, vals, context = []) 它会正常工作吗?
  • 不,我不是这个意思,告诉我们你是如何调用xyz的,这是导致异常的原因
猜你喜欢
  • 1970-01-01
  • 2016-03-21
  • 2013-10-18
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 2010-10-20
相关资源
最近更新 更多