2017-11-19 16 views
-1

値を返す関数def calculate_delivery_scheduleを作成しようとしています。UnboundLocalError:代入(Python)の前に参照されるローカル変数 'package_line_id'

私はこの場合の問題ではないと思います。これは私のコードです。ここで

私の.pyコードがある=このhave_delivery_scheduleと

def calculate_delivery_schedule(self): 
    delivery_orders = {} 
      utc = pytz.timezone('UTC') 
      have_delivery_schedule = False 
      total_qty = 0 
      for sale_order_line in self.order_line: 
       if sale_order_line.schedule_line_ids: 
        if len(sale_order_line.schedule_line_ids) > 1: 
         have_delivery_schedule = True 
        else: 
         have_delivery_schedule = False 
        print "line 28", have_delivery_schedule, sale_order_line.schedule_line_ids, len(sale_order_line.schedule_line_ids) 
        for schedule in sale_order_line.schedule_line_ids: 
         if schedule.date2 not in delivery_orders: 
          if sale_order_line.product_id.pack: 
           delivery_list = {} 
           for package_line_id in sale_order_line.package_line_ids: 
            val_q = package_line_id.qty * schedule.qty 
            delivery_list.update(
             { 
              package_line_id.product_id: val_q 
             }) 
           delivery_orders[schedule.date2] = delivery_list 
          else: 
           delivery_orders[schedule.date2] = {sale_order_line.product_id: schedule.qty} 
           print "line 41", delivery_orders[schedule.date2] 
         else: 
          if sale_order_line.product_id.pack: 
           for product_uom_qty in sale_order_line.package_line_ids: 
            delivery_orders[schedule.date2].update({package_line_id.product_id: schedule.qty}) 
          else: 
           delivery_orders[schedule.date2][sale_order_line.product_id] = schedule.qty 
         total_qty += schedule.qty 

リターン

if have_delivery_schedule: 
       print "test", have_delivery_schedule 
       print "do", delivery_orders 
       for date2, vals_dict in delivery_orders.iteritems(): 
        print "date2", date2 
        print "delivery_orders", delivery_orders 
        for prod_key, vals in vals_dict.iteritems(): 
         print "Line 81", total_qty 
         print vals 
         delivery_orders[date2][prod_key] = vals/total_qty 
         # delivery_orders[date][product_qty] = total_qty 
         print "line 83 -------------------------------------", vals, total_qty, schedule.qty 
       print "Line 84 : ", delivery_orders 
     print "Line 86: ", delivery_orders 
     return delivery_orders 
     # else: 
     #  return False 

エラー:

File "/media/f/Data/odoo10/product_pack/models/sale_order.py", line 95, in action_confirm 
    schedule_deliveries = self.calculate_delivery_schedule() 
    File "/media/f/Data/odoo10/product_pack/models/sale_order.py", line 49, in calculate_delivery_schedule 
    delivery_orders[schedule.date2].update({package_line_id.product_id: schedule.qty}) 
UnboundLocalError: local variable 'package_line_id' referenced before assignment 

どのようにそれを修正するには?何か案は?あなたは上記のコード行でpackage_line_idを使用する場合

+0

エラーメッセージは明らかです。ローカル変数は、設定される前に使用されていました。 –

答えて

0
delivery_orders[schedule.date2].update({package_line_id.product_id: schedule.qty}) 

することは、あなたはそれが、この他のブロックではなく、そのブロック場合は対応に設定されていなかったことを実現していませんでした。したがって、elseが実行されると、この変数は設定されていません。これは明らかです。

+0

私は明確ではない、私は他のすべてのブロックでそれを定義する必要がありますか? define package_line_id – Ftr

+0

はい、必要です。あなたが 'sale_order_line.package_line_idsのpackage_line_id'を実行したとき、そのブロックに設定されました。したがって、変数として早期に設定するか、ここで再度設定します。
Pythonでの字下げは、スコープを定義するために使用され、そこに宣言されている変数の制限です。それは、他の関数の変数を矛盾なく再利用できる理由です(常にアドバイスされているわけではありません) – kmcodes

関連する問題