Почему я получаю python UnboundLocalError при вызове super()?

Мой класс просто так:

from openerp import tools
from openerp.osv import osv, fields
import requests
import logging
import json

_logger = logging.getLogger(__name__)

class stock_move(osv.Model):
    _inherit = 'stock.move'

    def create(self, cr, uid, vals, context=None):
        new_id = super(stock_move, self).create(cr, uid, vals, context=context)

Но когда я запускаю его, я получаю следующее:

File "/opt/odoo/ebuynow/ebn_oddjobs/models.py", line 15, in create
    new_id = super(stock_move, self).create(cr, uid, vals, context=context)
UnboundLocalError: local variable 'stock_move' referenced before assignment

Я почти уверен, что это правильный способ использования super(), потому что этот код отлично работал в другой системе. Этот вопрос более актуален, если есть кто-нибудь, кто знает, что это может быть в системе или среде Python, что может привести к тому, что он не распознает stock_move как имя класса для вызова метода create() родительского класса.

Система — сервер Ubuntu 14.04, Python 2.7.6. Предыдущая система, на которой работал код, была Ubuntu Desktop 14.04, на которой также работал Python 2.7.6.

Я просто не вижу причин, по которым это могло бы произойти. Почему Python считает stock_move локальной переменной?

Редактировать:

После изменения имени класса я получаю следующее:

new_id = super(stock_move_too, self).create(cr, uid, vals, context=context)
UnboundLocalError: local variable 'stock_move' referenced before assignment

stock_move вообще не используется, а ошибка все еще отображается ??

Редактировать2:

Проблема была вызвана тем, что odoo-server фактически не отключился, когда я ввел команду «sudo /etc/init.d/odoo-server restart». Как только я убил процесс, а затем перезапустил его, он начал перезапускаться правильно.


person glimmertea    schedule 05.12.2014    source источник
comment
Вы не показали все из create; вы повторно использовали имя stock_move где-то еще в этом методе.   -  person Martijn Pieters    schedule 05.12.2014
comment
Я буквально удалил все остальное в файле, чтобы добраться до сути, и это все еще происходит. Это действительно весь файл.   -  person glimmertea    schedule 05.12.2014
comment
Единственный способ получить исключение — это наличие фактического присваивания, цели цикла for, цели оператора with, имени аргумента или оператора import, использующего то же имя в методе create.   -  person Martijn Pieters    schedule 05.12.2014
comment
Попробуйте переименовать класс; он должен, по крайней мере, показать, принято ли изменение.   -  person Martijn Pieters    schedule 05.12.2014
comment
Ваш новый код не принимается. Вы перезапустили сервер? Попробуйте удалить файл .pyc для модуля (кешированный байт-код); если отметка времени в этом файле новее, Python не обнаружит, что вы изменили источник.   -  person Martijn Pieters    schedule 05.12.2014
comment
На самом деле я не могу найти файлы pyc. Я думаю, что вы правы насчет источника моей проблемы, и спасибо за это, но я не уверен, почему перезапуск сервера не вызывает файлы pyc, где бы они ни находились (не в том же каталоге, что и .py файлы, как обычно), для перекомпиляции.   -  person glimmertea    schedule 05.12.2014


Ответы (1)


Вы использовали то же имя внутри своего метода create, поэтому Python выделил stock_move как локальное, а не глобальное имя.

Python определяет область имен во время компиляции, и область имен применяется ко всему блоку. Имена рассматриваются как локальные, как только вы привязываете имя в любом месте области действия функции; это означает, что вы использовали имя в присваивании (stock_move = ...), использовали его как имя параметра для своей функции, использовали его для импорта (from somewhere import stock_move) или использовали его в качестве цели в цикле for, операторе with или обработчике except (with foo as stock_move, так далее.).

person Martijn Pieters    schedule 05.12.2014
comment
Я считаю, что это действительно была первоначальная причина ошибки. Я принял ваш ответ, но моя настоящая проблема не устранена, потому что я не могу найти файлы .pyc. В каждом другом дополнении odoo и каждом другом модуле Python, над которым я работал, они находятся в том же месте, что и соответствующий файл .py. - person glimmertea; 06.12.2014
comment
@glimmertea: похоже, ваш код импортируется из где-то еще. - person Martijn Pieters; 06.12.2014
comment
Тем не менее изменения, которые я вношу в исходный файл, по-прежнему отображаются в трассировке исключений. Это не то, что я видел раньше. - person glimmertea; 06.12.2014
comment
@glimmertea: байт-код Python на самом деле не является чем-то, что вы хотите сбрасывать в трассировку, поэтому он содержит указатели на исходный исходный файл, который затем считывается во время создания исключения; поэтому, если исходный код был изменен с момента последней компиляции байт-кода... - person Martijn Pieters; 06.12.2014
comment
да я это понимаю. Загадка в том, почему байт-кода нет в каталоге, где находятся файлы. - person glimmertea; 06.12.2014
comment
@glimmertea: вы можете попробовать распечатать __file__ глобальный модуль, чтобы увидеть, откуда он был загружен. - person Martijn Pieters; 06.12.2014