local variable referenced before assignment

0

I am having problems with this code, it appears that the variable specified in line 242. (Marked):

    totalCompra= totalCompra + int(aux2[2])*int(itemAmount)
UnboundLocalError: local variable 'totalCompra' referenced before assignment

I enclose all the code so that everything is complete, if you can help thanks.

#Menu Principal
def menuPrincipal():
    print ("Menu Principal- Elija una accion:")#Funciona
    print ("1- Agregar o quitar un producto")#Funciona
    print ("2- Realizar una compra")
    print ("3- Actualizar Precios")#Funciona
    print ("4- Articulo mas vendido")
    print ("5- Productos Vencidos")#Funciona
    print ("6- Articulo mas Vendido segun la clasificacion")
    print ("7- Ver listado de productos")#Funciona
    print ("8- Salir")#Funciona
    choice=input()

#Muestra agregarQuitar
    if choice=='1':
        agregarQuitar()

 #Muestra top Venta
    if choice=='4':
        filtrarVentas()
        topVenta()

    #Muestra vencidos
    if choice =="5":
        print(vencidos)
        menuPrincipal()



    #Muestra el listado
    if choice=="7":
        verListado()
        menuPrincipal()


    #Sale del programa
    if choice=="8":
        quit()

    #Actualizar un precio
    if choice=='3':
        actualizarPrecio()

#Compra del cliente
    if choice=="2":
        compraCliente()



#Define todo
productos={20:('coca','10','2','2/2/21','b')}
vencidos={}
ventas=[]
Factura={}
record={}
totalCompra=0
totalCompra1=0

#Menu de Agregar o Quitar algun producto
def agregarQuitar():

#Login basico para verificar identidad
    print("Verifique Su Identidad")
    print("Ingrese nombre de usuario:")
    usr=input()
    print ("Ingrese su contraseña:")
    pwd=input()

#Cuando se chequea sigue adelante o vuelve al menu principal
    if usr=="admin" and pwd=="admin":
        print ("Seleccione que quiere hacer")
        print ("1-Agregar un producto")
        print ("2-Quitar un producto")
        adminChoice=input()
        if adminChoice=="1":
            print ("Ingrese la clave del producto")
            clave=input()
            print ("Ingrese los valores. SEPARADOS POR UN ESPACIO EN EL SIGUIENTE FORMATO")
            print("descripcion,stock,precio unitario,vencimiento dd/mm/aa ,tipo de producto")

#Hace una lista con las caracteristicas del codigo de identificacion.
            values=input().split()

#Agrego el producto al diccionario
            productos[int(clave)]=values


#Chekeo de vencidos luego de agregar:
            import time
            currentDate=(time.strftime("%d/%m/%y")).split('/')
            date= productos[int(clave)]
            ix=list(date)
            pi= ix[3].split('/')

            if pi[2]< currentDate[2]:
                vencidos[int(clave)]=values
                del productos[int(clave)]
            if pi[2]>= currentDate[2] and pi[1]< currentDate[1]:
                vencidos[int(clave)]= values
                del productos[int(clave)]
            if pi[2]>= currentDate[2] and pi[1]>= currentDate[1] and pi[0]< currentDate[0]:
                vencidos [int(clave)] = values
                del productos[int(clave)]


#Chekea si el producto fue eliminado por estar vencido o no
            for c in productos.keys():
                if c == int(clave):
                    print ("El producto fue agregado exitosamente")
                else:
                    print ("El producto esta vencido, no se pudo agregar")

            menuPrincipal()

#Menu de eliminar un producto
    if adminChoice=="2":
#Si no conoce la lista de productos se imprime
        print ("¿Quiere ver la lista de productos? S/N")
        rta=input()
        if rta=="s":
            print (productos)
            print ("Ingrese la clave del producto que quiere borrar:")
            deleteKey=input()
        if rta=="n":
            print ("Ingrese la clave del producto que quiere borrar:")
            deleteKey=input()

#Reconfirmacion de que quiere eliminar el producto.
        print ("¿Esta Seguro que quiere eliminar el producto?  s/n")
        adminConfirm=input()
        if adminConfirm=="s":
            del productos [deleteKey]
            print ("Producto eliminado")
            menuPrincipal()
        else:
            menuPrincipal()

    else:
        print("Error al iniciar sesion Usuario o Contraseña invalido")
        menuPrincipal()


#Funcion para actualizar el precio de un producto
def actualizarPrecio():
    print ("¿Quiere ver la lista de productos? S/N")
    rta=input()
    if rta=="s":
        print (productos)
        print ("Ingrese la clave del producto que quiere modificar:")
        modifyKey=input()
    if rta=="n":
        print ("Ingrese la clave del producto que quiere modificar:")
        modifyKey=input()

    print ("Ingrese el nuevo precio del producto:")
    newPrice=input()
    #Confirmacion de que quiere modificar el producto.
    print ("¿Esta Seguro que quiere modificar el producto?  s/n")
    adminConfirm=input()
    if adminConfirm=="s":
        #convertir la tupla a lista
        aux= productos[int(modifyKey)]
        k= list(aux)
        #Reasigna el precio que esta en esa posicion al precio nuevo.
        k[2]= newPrice
        #Vuelve a hacerlo tupla y se mete en el diccionario
        i=tuple(k)
        productos[int(modifyKey)] = i
        print ("Producto modificado")
        menuPrincipal()
    else:
        menuPrincipal()


#Funcion para ver los productos
def verListado():
    print (productos)

def Options():
    print('1- Seguir comprando')
    print ('2- Terminar Compra')
    chosenOption=input()
    if chosenOption =='1':
        compraCliente()
    if chosenOption == '2':
        funcionTicket()

def actualizarStock():
    newStock= int(aux2[1]) - int(itemAmount)
    aux2[1]=newStock
    val1=tuple(aux2)
    productos[c]=val1

def filtrarVentas():
    for c in ventas:
        cant=ventas.count(c)
        record[c]=cant

def registroVentas():
    ventas.append(aux2[0])

def envioDomicilio():
    print('¿Quiere que le envien la compra a domicilio?')
    print ('s/n')
    envioChoice=input()
    if envioChoice == 's':
        print('ingrese nombre,direccion,telefono, separados por una coma.')
        datosCliente=input().split(',')
        print('el pedido sera enviado a ',datosCliente[1])
        menuPrincipal()
    else:
        menuPrincipal()



#Funcion de Compra de Cliente:
def compraCliente():
    print ('Ingrese que producto quiere llevar')
    customerChoice=input()
    for c in productos.keys():
        aux=productos[c]
        aux2=list(aux)
        compareValue=aux2[0]
        if compareValue==customerChoice:
            print('Ingrese cuantos quiere llevar')
            itemAmount=input()
            itemStock=aux2[1]
            if int(itemAmount)<= int(itemStock):
                #Check Expiration Date
                itemExpiration= aux2[3].split('/')
                import time
                currentDate=time.strftime("%d/%m/%Y").split('/')
                if str(int(currentDate[0])+7)== itemExpiration[0]:
                    #Hacer 10% de descuento
                    #ERROR PORQUE NO CALCULA LOS CAMBIOS DE MES.
                    totalCompra= totalCompra +(int(aux2[2])*int(itemAmount))*0.9
                    facturaDescuento()
                    registroVentas()
                    actualizarStock()
                    Options()
                else:
  ERROR--->         totalCompra1= totalCompra1 + int(aux2[2])*int(itemAmount)
                    facturaRegular()
                    registroVentas()
                    actualizarStock()
                    Options()

                if itemAmount > itemStock:
                    print('No hay suficiente cantidad')
                    print('Hay que reponer')
                    print('¿Desea ver cuantas unidades hay?')
                    print (' s/n ' )
                    e=input()
                    if e=='s':
                        print (itemStock)
                        Options()

def imprimirTicket():
    print(factura)
    print('-------')
    print('total:',totalCompra+totalCompra1)




menuPrincipal()
    
asked by Federico Agustin Franco 09.06.2018 в 02:31
source

1 answer

1

I simplify the code so that you understand it better ::

#!/usr/bin/env python

a = 0

def foobar():
    a = a + 2
    print(a)

foobar()

The code I wrote above generates the same error. The problem is that in python when you define (or assign value) a local variable (to the foobar function in this case) with the same name as a preexisting variable in a higher scope, the latter variable it ceases to exist within the function. Therefore, inside foobar "a" does not exist before you do:

a = a + 2

and, of course, generates failure. The solution is to declare within the function that "a" exists outside:

def foobar():
    global a
    a = a + 2
    print(a)
    
answered by 09.06.2018 в 15:12