2014-12-05 1 views
0

Мой класс просто:Почему я должен получать 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 

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

Система ubuntu server 14.04, python 2.7.6. Предыдущей системой, на которой работал код, был Ubuntu desktop 14.04, также работающий с python 2.7.6.

Я просто не вижу причин, почему это произойдет. Почему python считает, что share_move является локальной переменной?

Edit:

После изменения имени класса, я получаю это:

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

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

Edit2:

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

+0

Вы не показывали * все * из 'create'; вы повторно использовали имя 'stock_move' * где-то еще в этом методе *. –

+0

Я буквально удалил все остальное в файле, чтобы разобраться в этом, и это все еще происходит. Это действительно весь файл. – glimmertea

+0

Единственный способ получить исключение - это то, что есть фактическое назначение, цель для цикла loop, 'with', имя аргумента или выражение' import', которое использует это имя в методе 'create'. –

ответ

2

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

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

+0

@eryksun: согласовано, исправлено. –

+0

Я считаю, что это была оригинальная причина ошибки. Я принял ваш ответ, но моя фактическая проблема сохраняется, потому что я не могу найти файлы .pyc. В каждом другом дополнении odoo и в любом другом модуле python, над которым я работал, они находятся на том же месте, что и соответствующий им .py-файл. – glimmertea

+0

@glimmertea: так что ваш код импортируется из * где-то еще * кажется. –