UnboundLocalError: локальная переменная «prod_Available», на которую ссылаются до назначения - PullRequest
1 голос
/ 08 декабря 2011

Я занимаюсь разработкой системы бронирования, и у меня есть функция, которая сохраняет количество товара ... Мой вопрос: почему у меня возникла эта проблема? когда я

`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 голос
/ 08 декабря 2011

Просто инициализируйте 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 голос
/ 08 декабря 2011

Вы получаете различное поведение из-за передачи разных значений.

Для первого вызова вы передаете check_in='2011-12-15' и check_out='2011-12-10', а для второго у вас есть checkin='2011-12-10' и * 1006.*.Т.е. значения возврата и извлечения меняются местами.

Это означает, что цикл for x in range(start_date,end_date + 1): никогда не будет выполнен, поэтому никогда не устанавливается prod_Available.

Здесь есть два очевидных исправления:

  1. Улучшить проверку параметров и сообщить об ошибке, если дата выезда предшествует дате регистрации.

  2. Установите prod_Available вноль, прежде чем начать цикл.Это гарантирует, что он всегда установлен, даже если цикл не выполняется.

1 голос
/ 08 декабря 2011

Иногда ваш цикл не вводится, поэтому 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
...