0

私のクラスは単にこれです:

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() の正しい使用方法であると確信しています。この質問は、親クラスの create() メソッドを呼び出す目的で、stock_move をクラス名として認識しない原因となるシステムまたは Python 環境の可能性を知っている人がそこにいるかどうかをさらに尋ねています。

システムはubuntuサーバー14.04、python 2.7.6です。コードが実行された以前のシステムは、Python 2.7.6 を実行する ubuntu デスクトップ 14.04 でした。

これが起こる理由がわかりません。なぜ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:

この問題は、「sudo /etc/init.d/odoo-server restart」コマンドを発行したときに odoo-server が実際にシャットダウンしなかったことが原因でした。プロセスを強制終了してから再起動すると、適切に再起動し始めました。

4

1 に答える 1

2

メソッド内で同じ名前を使用したcreateため、Pythonはグローバル名ではなくローカルstock_move名としてマークされました。

Pythonはコンパイル時に名前のスコープを決定し、名前のスコープはブロック全体に適用されます。関数スコープ内の任意の場所に名前をバインドするとすぐに、名前はローカルとして表示されます。つまり、その名前を割り当て ( stock_move = ...) で使用したか、関数のパラメーター名として使用したか、インポート ( ) で使用したか、ループ、ステートメント、またはハンドラー (など)from somewhere import stock_moveでターゲットとして使用したことを意味します。forwithexceptwith foo as stock_move

于 2014-12-05T20:30:39.630 に答える