El gran libro de Python. Marco Buttu
Чтение книги онлайн.
Читать онлайн книгу El gran libro de Python - Marco Buttu страница 21
El nombre de una etiqueta es la cadena construida sobre la base de la etiqueta: por ejemplo, el nombre de la etiqueta foo es la cadena 'foo' y el del atributo path del módulo os es la cadena 'path'. La función integrada dir(), cuando se llama sin argumentos, devuelve una lista que contiene los nombres de las etiquetas en el ámbito actual; si no es así, al pasarle un objeto, como hemos visto en secciones anteriores, esta devuelve los nombres de los atributos más significativos de dicho objeto:
Así, el módulo os tiene el atributo path y el nombre de este atributo es la cadena 'path'. El nombre del objeto al cual hace referencia el atributo path de os, en los sistemas Unix-like, es la cadena 'posixpath':
NOTA
En la última sección de este capítulo hablaremos del módulo os, y veremos que en los sistemas Windows os.path hace referencia al módulo ntpath:
Un objeto no siempre tiene un nombre (las instancias de los tipos de datos básicos, por ejemplo, no lo tienen), mientras que una etiqueta sí, porque este lo da la etiqueta en forma de cadena. El nombre de un objeto, por tanto, no tiene nada que ver con el de las etiquetas que a él se refieren, porque, si lo pensamos bien, más de una etiqueta puede hacer referencia al mismo objeto. El único vínculo entre los dos es que, quizás (como para las clases, las funciones y los módulos), el nombre de la etiqueta se utiliza en el momento de la creación del objeto para asignarle el nombre:
Los nombres de las etiquetas tienen distintos contextos de uso. Por ejemplo, permiten recuperar los objetos a los cuales las etiquetas hacen referencia, utilizando los nombres como clave de diccionarios concretos que representan los espacios de nombres (namespace). Aunque hablaremos de ello con mayor profundidad en el Capítulo 4, vamos a mostrar un breve ejemplo, para exponer un caso práctico de uso. Para ello, consideremos la función integrada globals(), la cual devuelve los espacios de nombres global en forma de diccionario. Este último tiene como claves los nombres de las etiquetas globales, y como valores, los correspondientes objetos:
Dicho esto, cuando no exista ninguna posibilidad de error, hablaremos de la etiqueta pero refiriéndonos al objeto. Por ejemplo, en el caso siguiente:
en lugar de decir que "hemos sumado los objetos a los cuales se refieren a y b", diremos simplemente que hemos sumado a y b. Lo mismo es válido para los atributos, para los cuales diremos en el siguiente ejemplo que "hemos añadido un elemento al atributo a de Foo", en lugar de "hemos añadido un elemento al objeto al cual se refiere el atributo a de Foo":
En todos los casos que puedan dar lugar a malentendidos seremos más formales.
Tipos de errores
Los errores en un programa Python se manifiestan en forma de errores de sintaxis o de excepciones.
Errores de sintaxis
Como puede deducirse, los errores de sintaxis aparecen cuando una instrucción no se escribe correctamente. Por ejemplo, la omisión de los dos puntos al final de la instrucción for es un error de sintaxis:
Los errores de sintaxis se señalan con un mensaje que aparece en la línea de código en la cual se ha detectado el error, además de una pequeña flecha que indica el elemento siguiente al punto en que se ha detectado. En el ejemplo anterior, el error ha sido detectado antes de print(i) y, de hecho, inmediatamente después de range(10) faltan los dos puntos necesarios para terminar la instrucción for. También se muestran el nombre del archivo y el número de línea para así facilitar la identificación del error:
Los errores de sintaxis se señalan antes de que el programa sea ejecutado, puesto que se generan durante la fase de compilación en bytecode:
Las excepciones
Las excepciones se generan cuando una instrucción, aunque sintácticamente correcta, da lugar a errores durante su ejecución. Consideremos, por ejemplo, el archivo errors.py:
Hay un error tipográfico (hemos escrito prin en lugar de print), el cual será identificado solo cuando el flujo de ejecución llegue a esta instrucción, puesto que solo en dicho momento Python buscará la definición de la etiqueta prin. Así, el error se generará únicamente si el usuario escribe el carácter a:
Como se puede ver en este ejemplo, cuando las excepciones no son generadas por el programa, la ejecución termina y se muestra un mensaje de error. Este mensaje se distingue de los derivados de errores de sintaxis principalmente por la presencia del traceback.
NOTA
Las exepciones también pueden mostrarse a propósito, mediante la instrucción raise. Consideremos, por ejemplo, el archivo siguiente:
Esto es lo que ocurre cuando lo ejecutamos:
Hablaremos con mayor profundidad de la instrucción raise en el Capítulo 5.
Puesto que las excepciones son generadas solo cuando el fragmento de código que contiene el error es ejecutado, es posible que un programa funcione casi siempre. Si hubiéramos ejecutado el archivo errors.py efectuando 100 bucles, sin escribir nunca el carácter a, posiblemente hubiéramos estado seguros de que el programa no contenía error alguno. En el caso de que ocurran este tipo de problemas, nos podría ser útil utilizar alguna herramienta que analice el código Python con el fin de detectar posibles errores. Entre estos, citamos pyflakes y pylint. He aquí un ejemplo de uso de este último: