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í:

Python 2.x 2.0 2.7
 print "This line is ok"
     print "This line isn't ok"
Python 3.x 3.0
 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:

Python 2.x 2.0 2.7
 print "This line is ok"
  print "This line isn't ok"
Python 3.x 3.0
 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

Python 2.x 2.0 2.7
def foo():
    print "This should be part of foo()"
   print "ERROR!"
print "This is not a part of foo()"
Python 3.x 3.0
 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.

  1. Configure su editor para usar 4 espacios para la sangría.
  2. Haga una búsqueda y reemplace para reemplazar todas las pestañas con 4 espacios.
  3. 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:

Python 2.x 2.0 2.7
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
Python 3.x 3.0
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:

Python 2.x 2.0 2.7
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
Python 3.x 3.0
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:

Python 3.x 3.0
 >>> 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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow