调用super()时为什么会出现python UnboundLocalError?

时间:2014-12-05 20:29:31

标签: python python-2.7 openerp odoo openerp-8

我的课程就是这样:

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桌面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甚至根本没用,错误仍显示??

Edit2:

问题是由于我发出“sudo /etc/init.d/odoo-server restart”命令时odoo-server实际上没有关闭。一旦我杀死了该进程,然后重新启动它,它就开始正常重启。

1 个答案:

答案 0 :(得分:2)

您在create方法中使用了同名,因此Python将stock_move指定为本地,而不是全局名称。

Python在编译时确定名称​​的范围,并且名称范围适用于整个块。只要您在函数范围内的任何位置绑定名称,名称就会被视为本地名称;这意味着您在赋值(stock_move = ...)中使用了该名称,将其用作函数的参数名称,用于导入(from somewhere import stock_move)或将其用作{{1}中的目标}}循环,for语句或with处理程序(except等)。