[SOLUCIONADO] Python - ¿Por qué este error? No consigo entenderlo :(

Iniciado por Biodude9456, 2 Marzo 2016, 19:43 PM

0 Miembros y 1 Visitante están viendo este tema.

Biodude9456

Código (python) [Seleccionar]
def login():
   sesion = input("Nombre de usuario:  ")
   seguir = True
   while seguir:
       if sesion.lower()=="invitado":
           print("Has iniciado sesion como invitado.")
           seguir = False # Termina el while externo
       elif sesion.lower()=="patata":
           seguir = False
           seguir2 = True
           while seguir2: #bucle infinito hasta que password == "100azul100".
               password = input("Contrasena:  ")
               if password=="777":
                   print("Has iniciado sesion como administrador.")
                   seguir2 = False # Termina el while interno
                   start.admin = True
                   continue
       elif sesion.lower()!="patata"or" invitado":
           login()

login()
while start.admin: # me marca que no existe el start.admin
  print()
  print("1-Añadir o eliminar usuarios")
  #...


Nombre de usuario:  patata
Contrasena:  777
Has iniciado sesion como administrador.
Traceback (most recent call last):
 File "/storage/emulated/0/com.hipipal.qpyplus/scripts3/.last_tmp.py", line 21, in <module>
   login()
 File "/storage/emulated/0/com.hipipal.qpyplus/scripts3/.last_tmp.py", line 16, in login
   start.admin = True
NameError: global name 'start' is not defined


No entiendo, por qué no está definido :(

engel lex

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Biodude9456

#2
Código (python) [Seleccionar]
    if password=="777":
                   print("Has iniciado sesion como administrador.")
                   seguir2 = False # Termina el while interno
                   start.admin = True


Ahí


Edito: ese" ." de start.admin era un "_"

engel lex

si lo pones con un punto, estás tratando de acceder a la propiedad admin del objeto start...

la cosa es que en programacion existen lo que se llaman "scopes" que son los alcances de las variables... si  declaras una variable dentro de un scope (una sangria) no existe fuera de ella... es decir


Código (python) [Seleccionar]
variable1 = true;
while variable1:
    variable2 = false
    variable1=variable2 #esto si funciona porque variable1 está en un scope más externo
print(variable1)
print(variable2)#aqui da un error porque variable2 solo existe en el scope del while
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Biodude9456


engel lex

en la linea 1 declara start, en su defecto, puedes hacer return true para que la funcion retorne verdadero cuando deba
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Biodude9456


tincopasan

estás haciendo dos cosas mal:
1)usando la variable fuera de la función en la cual la definiste, para hacerlo debes declararla como global dentro de la función:
Código (python) [Seleccionar]

def login():
global startetc
startetc=lo que  quieras


2)no uses variables con punto, se interpreta como una propiedad de objeto, en todo caso usa _
start_etc

Biodude9456

Eso es lo que necesitaba! Gracias :) aún estoy aprendiendo  :-[