UnboundLocalError: 在赋值前引用了局部变量 'prod_Available
我正在开发一个预订系统,里面有一个功能是用来保存产品数量的……我想问的是,为什么我会遇到这个问题?当我
`curl -l -X POST -d "product=3&client=1&function=insert_booking&check_in=2011-12-15&check_out=2011-12-10&no_of_adult=2&no_of_kid=1&quantity=2&first_name=asda&last_name=sdsd&contact=34343" http://127.0.0.1:8000/api/reserve`
Piston/0.3dev (Django 1.3.1) crash report:
Traceback (most recent call last):
File "/home/agileone/workspace/bookproj/api/handlers.py", line 206, in create
prodAvailable = Hotel.objects.get_hotel_sum_quantity(attrs['product'], attrs['check_in'], attrs['check_out'])
File "/home/agileone/workspace/bookproj/../bookproj/booking/models.py", line 49, in get_hotel_sum_quantity
if prod_Available <= 0:
UnboundLocalError: local variable 'prod_Available' referenced before assignment
但是当我在Python的命令行测试时,一切都正常:
>>> from booking.models import *
>>> Hotel.objects.get_hotel_sum_quantity(3, '2011-12-10', '2011-12-15')1
这是我在models.py里的代码
def get_hotel_sum_quantity(self, product_id, checkin_date, checkout_date):
check_in = datetime.datetime.strptime(checkin_date, '%Y-%m-%d')
check_in = check_in.date()
start_date = check_in.day
check_out = datetime.datetime.strptime(checkout_date, '%Y-%m-%d')
check_out = check_out.date()
end_date = check_out.day
prod = Product.objects.get(id=product_id)
for x in range(start_date,end_date + 1):
x = x - start_date
delta = datetime.timedelta(days=x)
all_date = check_in + delta
sumOfQuantity = HotelCheck.objects.filter(date_booked=all_date, product=prod).aggregate(Sum('quantity'))['quantity__sum']
if sumOfQuantity == None:
sumOfQuantity = 0
prod_Available = prod.quantity - sumOfQuantity
#global prod_Available
if prod_Available <= 0:
status = 0
else:
status = 1
return status
还有我的handlers.py
if attrs['function'] == 'insert_booking':
prodAvailable = Hotel.objects.get_hotel_sum_quantity(attrs['product'], attrs['check_in'], attrs['check_out'])
if float(prodAvailable) <= 0:
disp = Hotel.objects.get_hotel_show_available(attrs['product'], attrs['check_in'], attrs['check_out'])
return {'status': '0', 'message': 'not OK!'}, disp
有没有人能解释一下我的情况,并给我一些解决的建议……谢谢
3 个回答
1
你遇到不同的行为是因为传入了不同的值。
在第一次调用时,你传入了 check_in='2011-12-15'
和 check_out='2011-12-10'
,而在第二次调用时,你传入的是 checkin='2011-12-10'
和 checkout='2011-12-15'
。也就是说,入住和退房的值是调换了的。
这意味着 for x in range(start_date,end_date + 1):
这个循环将永远不会执行,因此 prod_Available
也不会被设置。
这里有两个明显的解决办法:
加强参数验证,如果退房日期在入住日期之前,就报告一个错误。
在开始循环之前,将
prod_Available
设置为零。这样可以确保它总是被设置,即使循环没有执行。
1
在下面的for循环之前,先把prod_Available
初始化为Zero
。
for x in range(start_date,end_date + 1):
因为你是在循环里面给prod_Available
赋值,所以有可能这个变量根本没有被赋值,这样后面的if
语句就会出错。
if prod_Available <= 0:
相反,如果你这样做:
prod_Available =0 #Initialize outside loop
for x in range(start_date,end_date + 1):
就能解决你的问题。
1
有时候你的循环没有被执行,所以prod_Available
这个变量就没有被创建,但你却试图去使用它。
在循环之前,先把prod_Available = 0
放上:
prod = Product.objects.get(id=product_id)
prod_Available = 0 # !
for x in range(start_date,end_date + 1):
x = x - start_date
delta = datetime.timedelta(days=x)
all_date = check_in + delta
sumOfQuantity = HotelCheck.objects.filter(date_booked=all_date, product=prod).aggregate(Sum('quantity'))['quantity__sum']
if sumOfQuantity == None:
sumOfQuantity = 0
prod_Available = prod.quantity - sumOfQuantity
#global prod_Available
if prod_Available <= 0:
status = 0
else:
status = 1
return status