Python Language
Excepciones del Commonwealth
Buscar..
Introducción
Aquí en Stack Overflow a menudo vemos duplicados que hablan de los mismos errores: "ImportError: No module named '??????'
, SyntaxError: invalid syntax
o NameError: name '???' is not defined
. Este es un esfuerzo para reducirlos y para tener alguna documentación con la cual enlazar.
IndentationErrors (o indentation SyntaxErrors)
En la mayoría de los otros idiomas, la sangría no es obligatoria, pero en Python (y otros idiomas: versiones anteriores de FORTRAN, Makefiles, Whitespace (lenguaje esotérico), etc.) no es el caso, lo que puede ser confuso si viene de otro idioma. si estaba copiando el código de un ejemplo a su propio, o simplemente si es nuevo.
IndentationError / SyntaxError: sangría inesperada
Esta excepción se produce cuando el nivel de sangrado aumenta sin razón.
Ejemplo
No hay razón para aumentar el nivel aquí:
print "This line is ok"
print "This line isn't ok"
print("This line is ok")
print("This line isn't ok")
Aquí hay dos errores: el último y que la sangría no coincide con ningún nivel de sangría. Sin embargo solo se muestra una:
print "This line is ok"
print "This line isn't ok"
print("This line is ok")
print("This line isn't ok")
IndentationError / SyntaxError: unindent no coincide con ningún nivel de sangría externa
Parece que no te diste por completo.
Ejemplo
def foo():
print "This should be part of foo()"
print "ERROR!"
print "This is not a part of foo()"
print("This line is ok")
print("This line isn't ok")
Error Tabulación: Se esperaba un bloque tabulado
Después de dos puntos (y luego una nueva línea) el nivel de sangrado tiene que aumentar. Este error surge cuando eso no sucedió.
Ejemplo
if ok:
doStuff()
Nota : Use el pass
palabra clave (que no hace absolutamente nada) para simplemente poner un if
, else
, except
, class
, method
o definition
pero no diga lo que sucederá si la condición de llamada es verdadera (pero hágalo más tarde, o en el caso de except
: simplemente no hacer nada):
def foo():
pass
IndentationError: uso incoherente de tabulaciones y espacios en sangría
Ejemplo
def foo():
if ok:
return "Two != Four != Tab"
return "i dont care i do whatever i want"
Cómo evitar este error
No uses pestañas. Se desalienta por PEP8
, la guía de estilo para Python.
- Configure su editor para usar 4 espacios para la sangría.
- Haga una búsqueda y reemplace para reemplazar todas las pestañas con 4 espacios.
- Asegúrese de que su editor esté configurado para mostrar las pestañas en 8 espacios, para que pueda darse cuenta fácilmente de ese error y corregirlo.
Vea esta pregunta si desea aprender más.
TypeErrors
Estas excepciones se producen cuando el tipo de algún objeto debe ser diferente
TypeError: [definición / método] toma? argumentos posicionales pero? se le dio
Se llamó a una función o método con más (o menos) argumentos que los que puede aceptar.
Ejemplo
Si se dan más argumentos:
def foo(a): return a
foo(a,b,c,d) #And a,b,c,d are defined
Si se dan menos argumentos:
def foo(a,b,c,d): return a += b + c + d
foo(a) #And a is defined
Nota : si desea usar un número desconocido de argumentos, puede usar *args
o **kwargs
. Ver * args y ** kwargs
TypeError: tipo (s) de operando no compatibles para [operando]: '???' y '???'
Algunos tipos no se pueden operar juntos, dependiendo del operando.
Ejemplo
Por ejemplo: +
se usa para concatenar y agregar, pero no puede usar ninguno de ellos para ambos tipos. Por ejemplo, al intentar crear un set
concatenando ( +
ing) 'set1'
y 'tuple1'
el error. Código:
set1, tuple1 = {1,2}, (3,4)
a = set1 + tuple1
Algunos tipos (por ejemplo: int
y string
) usan ambos +
pero para diferentes cosas:
b = 400 + 'foo'
O puede que ni siquiera se utilicen para nada:
c = ["a","b"] - [1,2]
Pero puedes, por ejemplo, agregar un float
a un int
:
d = 1 + 1.0
Error de tecleado: '???' El objeto no es iterable / subscriptible:
Para que un objeto sea iterable, puede tomar índices secuenciales desde cero hasta que los índices ya no sean válidos y se IndexError
un IndexError
(más técnicamente: debe tener un método __iter__
que devuelve un __iterator__
, o que defina un método __getitem__
que sí lo mencionado anteriormente).
Ejemplo
Aquí estamos diciendo que la bar
es el elemento cero de 1. Tonterías:
foo = 1
bar = foo[0]
Esta es una versión más discreta: En este ejemplo for
intenta establecer x
a amount[0]
, el primer elemento en un iterable pero no puede porque cantidad es un int:
amount = 10
for x in amount: print(x)
Error de tecleado: '???' el objeto no es llamable
Está definiendo una variable y llamándola más tarde (como lo que hace con una función o método)
Ejemplo
foo = "notAFunction"
foo()
NameError: name '???' no está definido
Se genera cuando intenta utilizar una variable, método o función que no está inicializada (al menos no antes). En otras palabras, se genera cuando no se encuentra un nombre local o global solicitado. Es posible que haya escrito mal el nombre del objeto o se haya olvidado de import
algo. También tal vez esté en otro ámbito. Los cubriremos con ejemplos separados.
Simplemente no está definido en ninguna parte en el código
Es posible que haya olvidado inicializarlo, especialmente si es una constante.
foo # This variable is not defined
bar() # This function is not defined
Tal vez se define más adelante:
baz()
def baz():
pass
O no fue import
#needs import math
def sqrt():
x = float(input("Value: "))
return math.sqrt(x)
Los alcances de Python y la Regla LEGB:
La llamada Regla de LEGB habla sobre los alcances de Python. Su nombre se basa en los diferentes ámbitos, ordenados por las prioridades correspondientes:
Local → Enclosed → Global → Built-in.
- L ocal: Variables no declaradas globalmente o asignadas en una función.
- E nclosing: Variables definidas en una función que está envuelta dentro de otra función.
- Ondoparael: Las variables declaradas globales, o asignados en el nivel superior de un archivo.
- B uilt-in: variables preasignadas en el módulo de nombres incorporado.
Como ejemplo:
for i in range(4):
d = i * 2
print(d)
d
es accesible porque el bucle for
no marca un nuevo ámbito, pero si lo hiciera, tendríamos un error y su comportamiento sería similar a:
def noaccess():
for i in range(4):
d = i * 2
noaccess()
print(d)
Python dice NameError: name 'd' is not defined
Otros errores
AssertError
La assert
declaración existe en casi todos los lenguajes de programación. Cuando tu lo hagas:
assert condition
o:
assert condition, message
Es equivalente a esto:
if __debug__:
if not condition: raise AssertionError(message)
Las aserciones pueden incluir un mensaje opcional, y puedes deshabilitarlas cuando hayas terminado la depuración.
Nota : la depuración de la variable incorporada es Verdadero en circunstancias normales, Falso cuando se solicita la optimización (opción de línea de comando -O). Las asignaciones a depuración son ilegales. El valor de la variable incorporada se determina cuando se inicia el intérprete.
Teclado interrumpir
Se produjo un error cuando el usuario presiona la tecla de interrupción, normalmente Ctrl + C o del .
ZeroDivisionError
1/0
calcular 1/0
que no está definido. Vea este ejemplo para encontrar los divisores de un número:
div = float(raw_input("Divisors of: "))
for x in xrange(div+1): #includes the number itself and zero
if div/x == div//x:
print x, "is a divisor of", div
div = int(input("Divisors of: "))
for x in range(div+1): #includes the number itself and zero
if div/x == div//x:
print(x, "is a divisor of", div)
ZeroDivisionError
porque el bucle for
asigna ese valor a x
. En su lugar debería ser:
div = float(raw_input("Divisors of: "))
for x in xrange(1,div+1): #includes the number itself but not zero
if div/x == div//x:
print x, "is a divisor of", div
div = int(input("Divisors of: "))
for x in range(1,div+1): #includes the number itself but not zero
if div/x == div//x:
print(x, "is a divisor of", div)
Error de sintaxis en buen código
La gran mayoría de las veces que un SyntaxError que apunta a una línea sin interés significa que hay un problema en la línea anterior (en este ejemplo, es un paréntesis que falta):
def my_print():
x = (1 + 1
print(x)
Devoluciones
File "<input>", line 3
print(x)
^
SyntaxError: invalid syntax
La razón más común para este problema son paréntesis / paréntesis que no coinciden, como muestra el ejemplo.
Hay una advertencia importante para las declaraciones impresas en Python 3:
>>> print "hello world"
File "<stdin>", line 1
print "hello world"
^
SyntaxError: invalid syntax
Debido a que la declaración de print
fue reemplazada con la función print()
, entonces usted quiere:
print("hello world") # Note this is valid for both Py2 & Py3