2015-09-24 3 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) 

Этот случай определяет, что вы передаете 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) 

Во-вторых, вы всегда передаете никому метод записи, а не контекст = контекст, поэтому нет никаких шансов, кроме 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 в аргументе, поэтому в контексте метода записи должно быть Нет косвенным образом, но тем не менее оно отлично работает. –

+0

@Ravi это аргумент по умолчанию, если вы передаете ему другое значение в вызове функции, тогда аргумент по умолчанию не используется. – hspandher

+0

Я изменил свой ответ, посмотрю, получилось ли вы сейчас – hspandher

Смежные вопросы