.. _errors: 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. .. literalinclude:: error_examples/objecthasnoattribute1.py :language: python :linenos: .. literalinclude:: error_examples/objecthasnoattribute1.txt :language: python 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. .. literalinclude:: error_examples/objecthasnoattribute2.py :language: python :linenos: .. literalinclude:: error_examples/objecthasnoattribute2.txt :language: python 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. .. literalinclude:: error_examples/objecthasnoattribute3.txt :language: python 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. .. literalinclude:: error_examples/filenotfound1.py :language: python :linenos: .. literalinclude:: error_examples/filenotfound1.txt :language: python 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. .. literalinclude:: error_examples/nomodulenamed1.txt :language: python 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``. .. literalinclude:: error_examples/expectindent1.py :language: python :linenos: .. literalinclude:: error_examples/expectindent1.txt :language: python 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. .. literalinclude:: error_examples/unexpectindent1.py :language: python :linenos: .. literalinclude:: error_examples/unexpectindent1.txt :language: python 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. .. literalinclude:: error_examples/unindentdoesnotmatch1.py :language: python :linenos: .. literalinclude:: error_examples/unindentdoesnotmatch1.txt :language: python 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. .. literalinclude:: error_examples/indexoutrange1.py :language: python :linenos: .. literalinclude:: error_examples/indexoutrange1.txt :language: python 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. .. literalinclude:: error_examples/keyerror1.txt :language: python 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``. .. literalinclude:: error_examples/namenotdefined1.py :language: python :linenos: .. literalinclude:: error_examples/namenotdefined1.txt :language: python 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. .. literalinclude:: error_examples/namenotdefined2.txt :language: python 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ó ``*``. .. literalinclude:: error_examples/invalidsyntax1.py :language: python :linenos: .. literalinclude:: error_examples/invalidsyntax1.txt :language: python Utilitzar ``=`` en comptes de ``==`` per fer comparacions. .. literalinclude:: error_examples/invalidsyntax2.py :language: python :linenos: .. literalinclude:: error_examples/invalidsyntax2.txt :language: python 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``. .. literalinclude:: error_examples/invalidsyntax3.py :language: python :linenos: .. literalinclude:: error_examples/invalidsyntax3.txt :language: python Utilitzar una paraula reservada de Python com a nom de variable (en aquest exemple in) .. literalinclude:: error_examples/invalidsyntax4.py :language: python :linenos: .. literalinclude:: error_examples/invalidsyntax4.txt :language: python 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. .. literalinclude:: error_examples/eolscanning1.py :language: python :linenos: .. literalinclude:: error_examples/eolscanning1.txt :language: python SyntaxError: EOF while scanning triple-quoted string literal ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Exemple** .. literalinclude:: error_examples/eolscanningtriple1.py :language: python :linenos: .. literalinclude:: error_examples/eolscanningtriple1.txt :language: python 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. .. literalinclude:: error_examples/cantconvertstr1.py :language: python :linenos: .. literalinclude:: error_examples/cantconvertstr1.txt :language: python 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. .. literalinclude:: error_examples/unorderabletypes1.txt :language: python 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. .. literalinclude:: error_examples/canonlyconcat1.py :language: python :linenos: .. literalinclude:: error_examples/canonlyconcat1.txt :language: python 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. .. literalinclude:: error_examples/indicesmustbe1.txt :language: python 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. .. literalinclude:: error_examples/unsupportedop1.txt :language: python 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ó. .. literalinclude:: error_examples/badoptypeunary1.txt :language: python 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. .. literalinclude:: error_examples/objectnotsubscript1.py :language: python :linenos: .. literalinclude:: error_examples/objectnotsubscript1.txt :language: python 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. .. literalinclude:: error_examples/missingposargument.py :language: python :linenos: .. literalinclude:: error_examples/missingposargument.txt :language: python 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. .. literalinclude:: error_examples/cannotbeinterpreted1.py :language: python :linenos: .. literalinclude:: error_examples/cannotbeinterpreted1.txt :language: python 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. .. literalinclude:: error_examples/unhashabletype1.txt :language: python 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. .. literalinclude:: error_examples/localvarrefbefore1.py :language: python :linenos: .. literalinclude:: error_examples/localvarrefbefore1.txt :language: python 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. .. literalinclude:: error_examples/couldnotconvert1.txt :language: python 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. .. literalinclude:: error_examples/invalidliteralforint1.txt :language: python 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. .. literalinclude:: error_examples/mathdomain.py :language: python :linenos: .. literalinclude:: error_examples/mathdomain.txt :language: python