Common Python Errors¶
This is a list of the common errors one may find when producing Python code.
AttributeError¶
AttributeError: XXX object has no attribute YYY¶
S’ha intentat aplicar un mètode (indicat per YYY) a l’objecte XXX però el mètode no existeix pel tipus de XXX.
Un cas particular es dóna quan s’importa un mòdul amb la sentència import i s’intenta cridar una funció d’aquest mòdul que no existeix al fitxer.
Exemples
En aquest exemple s’intenta aplicar el mètode replace a una llista però aquest mètode no existeix per a aquest tipus.
1def canvia_0_per_1(llista):
2 i=0
3 for i in range(len(llista)):
4 if llista[i]==0:
5 llista = llista.replace(0,1)
6
>>> lnum = [0,2,5,0,2,0]
>>> objecthasnoattribute1.canvia_0_per_1(lnum)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "objecthasnoattribute1.py", line 5, in canvia_0_per_1
llista = llista.replace(0,1)
AttributeError: 'list' object has no attribute 'replace'
En aquest exemple nomfitxer és un paràmetre de tipus string que conté el nom d’un fitxer. La notació nomfitxer.txt, conté un objecte tipus string seguit d’un punt i, per tant, és interpretada per Python com una crida al mètode txt que ha de ser un mètode d’strings, però no existeix aquest mètode i dóna error.
1def cost_total(nomfitxer):
2 f = open(nomfitxer.txt,'r')
3 ctotal = 0
4 for linia in f:
5 ldades = linia.split()
6 unitats = int(ldades[1])
7 cost = float(ldades[2])
8 ctotal = ctotal + unitats * cost
9 f.close()
10 return ctotal
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "objecthasnoattribute2.py", line 2, in cost_total
f = open(nomfitxer.txt,'r')
AttributeError: 'str' object has no attribute 'txt'
Aquest exemple correspón al cas particular esmentat abans. S’importa el mòdul inventari i després es crida a la funció del mòdul anomenada total. L’error indica que no hi ha cap funció al fitxer inventari.py que estigui definida amb aquest nom.
>>> import inventari
>>> inventari.total()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'total'
FileNotFoundError¶
FileNotFoundError: [Errno 2] No such file or directory: XXX¶
S’ha intentat obrir per lectura un fitxer de nom XXX que no existeix.
Exemple
En aquest exemple, a la línia 2 s’intenta obrir el fitxer inventari.txt per lectura, però Python no troba aquest fitxer. Sovint el problema resideix en que no és el nom correcte o el fitxer no està al directori (carpeta) on estem situats.
1def cost_total():
2 f = open('inventari.txt','r')
3 ctotal = 0
4 for linia in f:
5 ldades = linia.split()
6 unitats = int(ldades[1])
7 cost = float(ldades[2])
8 ctotal = ctotal + unitats * cost
9 f.close()
10 return ctotal
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "filenotfound1.py", line 2, in cost_total
f = open('inventari.txt','r')
FileNotFoundError: [Errno 2] No such file or directory: 'inventari.txt'
ImportError¶
ImportError: No module named XXX¶
S’ha intentat importar un mòdul de nom XXX.py* però no existeix cap fitxer amb aquest nom.
Exemple
En aquest exemple s’intenta importar el mòdul conversions.py però dóna error perquè Python no troba aquest fitxer. Sovint el problema resideix en que no és el nom correcte o el fitxer no està al directori (carpeta) on estem situats.
>>> import conversions
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named 'conversions'
IndentationError¶
IndentationError: expected an indented block¶
Falten espais davant d’una sentència que va dins d’un bloc de codi a un if, while, for, etc.
Exemple
En aquest exemple la sentència que s’ha d’executar si es compleix la condició no pot anar a la mateixa alçada de l’if.
1def descompte1(imp,iva):
2 total = imp + imp*iva/100.0
3 if total > 100:
4 total = total -5
5 return total
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "expectindent1.py", line 4
total = total -5
^
IndentationError: expected an indented block
IndentationError: unexpected indent¶
Sobren espais davant d’una sentència.
Exemple
En aquest exemple la línea 3 té més espais dels necessaris i hauria d’anar a l’alçada de la línia anterior.
1def descompte1(imp,iva):
2 total = imp + imp*iva/100.0
3 total = total -5
4 return total
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "unexpectindent1.py", line 3
total = total -5
^
IndentationError: unexpected indent
IndentationError: unindent does not match any outer indentation level¶
L’espaiat d’una sentència no s’ajusta a cap nivel d’espaiat de les altres.
Exemple
En aquest example la sentència de la línia 4 no està aliniada ni amb la línia 1 ni amb la 2 i la 3. En aquest cas hauría de tenir un espai més.
1def descompte1(imp,iva):
2 total = imp + imp*iva/100.0
3 total = total -5
4 return total
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "unindentdoesnotmatch1.py", line 4
return total
^
IndentationError: unindent does not match any outer indentation level
IndexError¶
IndexError: XXX index out of range¶
S’ha intentat accedir a la posició d’un valor (del tipus indicat per XXX) utilitzant un índex que no està dintre del rang permés.
Exemple
En aquest exemple, la funció rep l’string text com a paràmetre i li assigna a la variable ultima la longitud d’aquest string(línia 2). Posteriorment (línia 3) s’intenta accedir a la posició indicada per ultima que està fora del rang permés i dòna error. Els índexs d’un string comencen des de 0 i així doncs el màxim índex permés és la longitud menys 1.
1def igualprimeraultima(text):
2 ultima = len(text)
3 if text[0] == text[ultima]:
4 return 'iguals'
5 else:
6 return 'diferents'
7
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "indexoutrange1.py", line 3, in igualprimeraultima
if text[0] == text[ultima]:
IndexError: string index out of range
KeyError¶
KeyError: XXX¶
S’ha intentat accedir a un valor d’un diccionari a través de la clau XXX però aquesta clau no existeix.
Exemple
En aquest exemple les claus del diccionari són els strings ‘BUS’, ‘BICING’ i ‘METRO’ i per tant l’intent d’accedir a través de la clau 12 dóna error.
>>> d = {'BUS':23,'BICING':35,'METRO':12}
>>> d[12]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 12
NameError¶
NameError: name XXX is not defined¶
S’ha fet referència a un nom (indicat per XXX) que Python no coneix perquè no és del llenguatge o no ha estat definit.
Exemples
Cridar una funció amb un nom diferent del que s’ha utilitzat a la definició. En aquest cas, la crida convsegons és incorrecta perquè hem definit la funció com a conv_segons.
1def conv_segons(h,m,s):
2 segons = h*3600+m*60+s
3 return segons
>>> from conversions import *
>>> convsegons(1,3,40)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'convsegons' is not defined
Utilitzar funcions d’un mòdul extern que no s’ha importat. En aquest cas, la crida a la funció sin és incorrecta perquè aquesta funció es troba al mòdul math i no s’ha importat. Un cop importat i cridat correctament ja funciona.
>>> sin(1.57)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'sin' is not defined
>>> import math
>>> math.sin(1.57)
0.9999996829318346
SyntaxError¶
SyntaxError: invalid syntax¶
La sintaxi no s’ajusta a les regles d’escriptura de Python.
Exemples
Utilitzar operadors de forma incorrecta. En aquest cas l’expressió que calcula 2 multiplicat per la variable k no és correcta perquè falta l’operador de multiplicació *.
1def f(x,k):
2 num = 1 /(2*x+1)
3 y = num/(2k-1)
4 res = num/y
5 return y
6
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "invalidsyntax1.py", line 3
y = num/(2k-1)
^
SyntaxError: invalid syntax
Utilitzar = en comptes de == per fer comparacions.
1def es_parell(n):
2 if n%2 = 0:
3 return True
4 else:
5 return False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "invalidsyntax2.py", line 2
if n%2 = 0:
^
SyntaxError: invalid syntax
No posar : al final de les sentències que el requereixen (if, elif, else, for, while, def). En aquest exemple falta posar-los al final de la sentència if.
1def es_parell(n):
2 if n%2 == 0
3 return True
4 else:
5 return False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "invalidsyntax3.py", line 2
if n%2 == 0
^
SyntaxError: invalid syntax
Utilitzar una paraula reservada de Python com a nom de variable (en aquest exemple in)
1def celsius_kelvin(c):
2 in = c + 273.15
3 return in
4
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "invalidsyntax4.py", line 2
in = c + 273.15
^
SyntaxError: invalid syntax
SyntaxError: EOL while scanning string literal¶
Falten cometes (simples o dobles, segons el codi) per obrir o tancar algun string.
Exemple
En aquest exemple falta tancar la cometa de l´últim string a la línia 2.
1def genera_adreca(nom,cognom):
2 s = nom + '.' + cognom + '@estudiant.upc.edu
3 return s
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "eolscanning1.py", line 2
s = nom + '.' + cognom + '@estudiant.upc.edu
^
SyntaxError: EOL while scanning string literal
SyntaxError: EOF while scanning triple-quoted string literal¶
Exemple
1def genera_adreca(nom,cognom):
2 """
3 >>> genera_adreca('pep','pepot')
4 'pep.pepot@estudiant.upc.edu'
5
6 s = nom + '.' + cognom + '@estudiant.upc.edu'
7 return s
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "eolscanningtriple1.py", line 7
return s
^
SyntaxError: EOF while scanning triple-quoted string literal
TypeError¶
TypeError: Can’t convert XXX object to str implicitly¶
S’ha intentat utilitzar una operació d’strings amb algun altre tipus de dades (indicat per XXX)
Exemple
En aquest exemple, a la línia 4 s’intenta concatenar un enter a la variable s que conté un string.
1def afegeix_bin(num):
2 s = '00'
3 if num >= 0:
4 s = s + 1
5 else:
6 s = s + '0'
7 return s
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "cantconvertstr1.py", line 3, in afegeix_bin
s = s + 1
TypeError: Can't convert 'int' object to str implicitly
TypeError: unorderable types: XXX > YYY¶
S’ha intentat comparar dos tipus diferents (XXX i YYY indiquen els tipus) que no es poden comparar perquè no tenen ordre entre ells.
Exemple
En aquest exemple la variable codi_prod conté un string i s’intenta comparar amb un enter.
>>> codi_prod = '2'
>>> codi_prod > 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() > int()
TypeError: can only concatenate XXX (not YYY) to XXX¶
S’ha intentat concatenar valors de dos tipus diferents (indicats per XXX i YYY).
Exemple
En aquest exemple, la funció interseccio s’ha executat amb els valors llista1=[1,2,3] i llista2=[2,3,4,5]. A la línia 5, s’intenta concatenar a la variable lres, que és una llista, un valor de llista1 que és un enter.
1def interseccio(llista1,llista2):
2 lres = []
3 for c in llista1:
4 if c in llista2:
5 lres = lres + c
6 return lres
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "canonlyconcat1.py", line 5, in interseccio
lres = lres + c
TypeError: can only concatenate list (not "int") to list
TypeError: XXX indices must be integers, not YYY¶
S’ha intentat accedir a un element d’un tipus indexat (com ara strings o llistes) amb un índex que no és enter.
Exemple
En aquest exemple s’intenta accedir a una posició d’un string utilitzant un altre string. Quan s’utilitza un enter (en aquest cas el 12) l’accés s’executa correctament.
>>> s = "Fonaments d'Informàtica"
>>> s['I']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: string indices must be integers
>>> s[12]
'I'
TypeError: unsupported operand type(s) for XXX: YYY and ZZZ¶
S’ha intentat aplicar un operador (indicat per XXX) a valors d’un tipus que no accepta aquest tipus d’operació (indicats per YYY i ZZZ).
Exemples
En aquests exemples s’intenta aplicar operands de tipus numèric (divisió, suma i resta) a tipus que no accepten aquesta mena d’operacions com strings o llistes.
>>> s1 = '3'
>>> s2 = '7'
>>> s1/s2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'str' and 'str'
>>> s1-2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'int'
>>> l = [2, 4, 5]
>>> 3.56+l
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'float' and 'list'
TypeError: bad operand type for unary XXX: YYY¶
S’ha intentat aplicar un operador unari (indicat per XXX) a un valor que no accepta aquest tipus d’operació (indicat per YYY).
Exemple
En aquest exemple s’aplica l’operació de canvi de signe a un string, tipus que no accepta aquesta operació.
>>> s = '3'
>>> -s
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: bad operand type for unary -: 'str'
TypeError: XXX object is not subscriptable¶
S’ha intentat accedir a un element a través d’un índex a un valor d’un tipus (indicat per XXX) que no accepta indexació o s’ha intentat obtenir una llesca d’un tipus que no accepta l’operació.
Exemple
En aquest exemple els valors que pren la variable i són enters, doncs estan generats a partir de la sentència for-in-range. A la línia 4 de la funció s’intenta accedir a la posició 0 de la variable i, la qual cosa dóna error perquè els enters no es poden indexar.
1def comenca_vocal(llista):
2 n = 0
3 for i in range(len(llista)):
4 if i[0] in 'AEIOUaeiou':
5 n = n + 1
6 return n
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "objectnotsubscript1.py", line 4, in comenca_vocal
if i[0] in 'AEIOUaeiou':
TypeError: 'int' object is not subscriptable
TypeError: XXX missing YYY required positional argument: ZZZ¶
S’ha intentat fer una crida a la funció (indicada per XXX) amb menys paràmetres (indicats per YYY) dels que requereix. El nom dels paràmetres està indicat per ZZZ.
Example
En aquest exemple, la funció conv_segons està definida amb tres paràmetres però a la crida només se li donen dos.
1def conv_segons(h,m,s):
2 segons = h*3600+m*60+s
3 return segons
>>> import conversions
>>> conversions.conv_segons(1,5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: conv_segons() missing 1 required positional argument: 's'
>>>
TypeError: XXX object cannot be interpreted as an YYY¶
S’ha utilitzat un valor o variable del tipus XXX en un context en el que es requereix el tipus YYY.
Exemple
En aquest exemple, a la línia 3, la funció range requereix un enter de paràmetre i se li ha passat una llista, en comptes de la longitud de la llista, que sí que és un enter.
1def suma_llista(l):
2 s = 0
3 for i in range(l):
4 s = s + l[i]
5 return s
>>> import cannotbeinterpreted
>>> cannotbeinterpreted.suma_llista([1,2,3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "cannotbeinterpreted.py", line 3, in suma_llista
for i in range(l):
TypeError: 'list' object cannot be interpreted as an integer
TypeError: unhashable type: XXX¶
S’ha intentat utilitzar com a clau d’un diccionari el tipus de dades XXX que no és immutable.
Exemple
En aquest exemple es defineix un diccionari a on les claus son tuples, però s’intenta comprovar si existeix una clau que és una llista, que és un tipus mutable i dóna error.
>>> d = {(1,2):'vermell',(5,5):'blau',(3,7):'blau'}
>>> llista = [2,3]
>>> llista in d
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>>
UnboundLocalError¶
UnboundLocalError: local variable xxx referenced before assignment¶
Dins una funció, s’ha intentat accedir al valor d’una variable que no ha estat definida abans.
Exemple
En aquest exemple no se li ha donat cap valor a la variable com i s’ha intentat accedir al seu valor a la línia 3.
1def comissions(dep,pref):
2 if dep > 500000:
3 com = com + dep * 0.005
4 if pref > 500000:
5 com = com + pref * 0.03
6 return com
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "localvarrefbefore1.py", line 3, in comissions
com = com + dep * 0.005
UnboundLocalError: local variable 'com' referenced before assignment
ValueError¶
ValueError: could not convert XXX to YYY: ZZZ¶
S’ha intentat fer una conversió des del tipus XXX al tipus YYY amb el valor ZZZ, però el valor no té un format adient per la conversió.
Exemple
En aquest exemple s’intenta convertir l’string s en un real però com que conté una coma no és possible portar a terme la conversió, doncs Python utilitza el punt per denotar els decimals i la funció float no sap interpretar l’string com a real. Posteriorment se li assigna un string que conté un punt i la conversió es realitza sense problemes.
>>> s = '276,25'
>>> float(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: '276,25'
>>> s = '276.25'
>>> float(s)
276.25
ValueError: invalid literal for int() with base 10: XXX¶
S’ha intentat fer una conversió a enter del valor XXX però aquest valor no té un format adient en base 10.
Exemple
En aquest exemple l’string s conté un punt i per tant el format és incorrecte com a enter. Posteriorment es mostra com en executar la conversió a float sí funciona, doncs el format és correcte com a real, o si se li assigna a l’string un valor només amb nombres enters, la conversió a enter també s’executa correctament.
>>> s = '276.25'
>>> float(s)
276.25
>>> s = '125.12'
>>> int(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '125.12'
>>> float(s)
125.12
>>> s = '125'
>>> int(s)
125
ValueError: math domain error¶
S’ha intentat executar una operació matemàtica amb dades incorrectes.
Exemple
En aquest exemple, s’intenta cridar a la funció f amb el valor 0 per al paràmetre x, amb la qual cosa, dins la funció, s’intenta calcular l’arrel quadrada de -1 i dóna error perquè és un nombre negatiu.
1import math
2
3def f(x):
4 return math.sqrt(x-1)+math.sin(x)
>>> import funcio
>>> funcio.f(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "funcio.py",line 4, in f
return math.sqrt(x-1)+math.sin(x)
ValueError: math domain error