Kitabı oku: «El gran libro de Python», sayfa 4
El Zen de Python
El 3 de junio de 1999, Patrick Phalen envió un mensaje a la python-list, titulado The Python Way. En él básicamente sugería a Guido van Rossum y Tim Peters escribir un documento con 10 o 20 aforismos que pudieran resumir el espíritu del lenguaje, una especie de Zen de Python:
¿Estarían dispuestos Guido e Tim Peters a colaborar en la elaboración de un breve documento -- llamémoslo “The Python Way” en ausencia de un título mejor -- que contenga 10 o 20 líneas para guiar a aquellos que se acercan a Python desde otros lenguajes, y que quieren conocer inmediatamente la manera de utilizarlo de forma correcta en aquellas situaciones más insidiosas (aplicar el cierre, etc.)?
Yo pensaba en un tipo de introducción muy breve, una especie de "Elementos de Estilo" de Strunk & White para Python, que listara las típicas recomendaciones fundamentales para escribir el código según el espíritu del lenguaje. Estoy hablando de una especie de Zen de Python -- algo a lo que acudir y consultar cuando aparecen demasiadas lamentaciones del tipo “fix Python now”.
Mensaje original:
http://mail.python.org/pipermail/python-list/1999-June/014096.html.
Al día siguiente, Tim Peters respondió a Patrick listando 19 aforismos y terminó diciendo:
Aquí están: exactamente 20 tesis pythónicas, contando la que dejo que escriba Guido. Si las respuestas a cualquier problema de diseño con Python no resultan obvias después de haberlas leído, entonces me retiro.
Mensaje original:
http://mail.python.org/pipermail/python-list/1999-June/001951.html.
El número 20 nunca ha llegado, y estos 19 aforismos han sido recogidos en la PEP-0020, The Zen of Python, escrita en 2004 por el mismo Tim Peters.
NOTA
Otro importante documento, que indica las directrices de comportamiento, es el Code of Conduct (Código de conducta), aprobado en abril de 2013 por la PSF. A diferencia del Zen de Python, que se centra en el código, el código de conducta pone su atención en el comportamiento para mantenerse en la comunidad Python; más concretamente, describe a un miembro de la comunidad Python como: abierto (open), considerado con los otros miembros (considerate) y respetuoso (respectful). El documento se encuentra disponible en la página: http://www.python.org/psf/codeofconduct/.
El módulo this de la librería estándar también está dedicado al Zen. En realidad, este módulo es más que un simple reclamo a los 19 aforismos: es un huevo de Pascua. Está escrito de manera que se pueda visualizar el Zen cuando se importa y, al mismo tiempo, que represente un claro ejemplo de aquello que no se debe hacer.
El origen del módulo this se remonta al año 2001, cuando, en ocasión de la décima International Python Conference (todavía no existía la Python Conference – PyCon), se estaba buscando un eslogan para estampar en las camisetas. Había distintas propuestas, pero al final la elección recayó en import this. Una vez elegido el eslogan, solo faltaba implementar un módulo denominado this. Y este fue el resultado:
Dudo que alguien entienda el significado de todo esto. El módulo ha sido escrito especialmente así, como ejemplo para dar a entender la importancia de seguir el Zen de Python:
Y esta es la traducción en español:
Si la validez de estas reglas nos ha convencido, podemos pasar a la siguiente sección; en caso contrario, será mejor que continuemos leyendo:
Python, además, sigue la conocida filosofía de Unix, doing one thing well, según la cual cada programa debe realizar una única cosa, pero bien hecha. Sin embargo, hacer una cosa bien no significa hacerla perfectamente. La perfección en el mundo real no existe, por lo que, según la frase la practicidad vence a la pureza, debemos hacer las cosas bastante bien, como sugiere también Alex Martelli en su charla titulada Good enough is good enough: http://pyvideo.org/video/1738/good-enough-is-good-enough.
Los elementos del código Python
Si miramos un archivo contenedor del código Python, veremos que, como cualquier archivo de texto, está formado por una serie de líneas, que llamaremos líneas físicas. Las líneas físicas no tienen ningún significado para el intérprete Python, sino que sirven sencillamente para organizar visualmente el código de manera legible. Por ejemplo, el archivo myfile.py contiene dos líneas físicas:
El significado obtenido por el intérprete son las líneas lógicas. Una línea lógica corresponde normalmente a una línea física, y es posible subdividir una línea física en más de una línea lógica, separándolas con un punto y coma. Por ejemplo, el siguiente archivo myfile.py contiene tres líneas físicas y seis líneas lógicas:
Probablemente en pocas ocasiones se verán más líneas lógicas en la misma línea física, puesto que es un pésimo estilo de programación, según aconseja de manera apropiada la PEP-0008.
También es posible repartir una línea lógica en varias líneas físicas. Esto puede verse a menudo, y puede hacerse tanto con la barra invertida, como en el ejemplo siguiente:
como mediante paréntesis:
y también separando en varias líneas físicas una lista, una tupla, un conjunto o un diccionario:
El texto contenido en el interior de una línea lógica pertenece a una de estas categorías: comentarios, literales, operadores, palabras clave, etiquetas y delimitadores. Consideremos, por ejemplo, el archivo siguiente:
Se estructura en cuatro líneas lógicas. En la primera, hay dos etiquetas, x e input, un literal de tipo cadena, que empieza y acaba con comillas simples, y tres delimitadores (los dos paréntesis y el signo igual). En la segunda línea hay tres etiquetas (num, int y x), tres delimitadores (los dos paréntesis y el signo igual) y un comentario (el texto que empieza con un símbolo de almohadilla y termina con la línea física). En la tercera hay dos etiquetas (result y num), un operador (/), un literal de tipo entero (10), un delimitador (el signo igual) y tres palabras clave: if, else y None. Por último, en la cuarta línea hay dos etiquetas (print y result) y dos delimitadores (los paréntesis).
El componente del intérprete que se ocupa de efectuar el análisis lexical del código se denomina parser.
Los comentarios
Como hemos visto, los comentarios sirven principalmente para documentar el código con el fin de facilitar su lectura. Se trata de fragmentos de texto que empiezan con el símbolo de almohadilla y terminan con el final de la línea física. Cuando el intérprete encuentra un comentario, no ejecuta ninguna acción:
Sin embargo, en ocasiones los comentarios son analizados por el parser por tener un significado especial, como en el caso del comentario sobre la codificación del código fuente, que hemos visto en la sección Ejecución del código Python a partir de un archivo.
Literales
Las instancias de los tipos de datos básicos se distinguen fácilmente unas de otras, además de por el tipo, también por el valor. Estos objetos son el corazón del lenguaje y representan los elementos clave de todos los programas Python. Para facilitar tanto la lectura como la escritura de los programas, se ha decidido asociar a estas instancias representaciones textuales de inmediata comprensión, que permitan determinar de manera única tanto el tipo como el valor del objeto al cual se refieren. Estas representaciones textuales se denominan literales.
Por ejemplo, un literal de cadena de texto es código delimitado por comillas simples, comillas, triples comillas simples o triples comillas. Cuando el programa se ejecuta, Python crea a partir del literal un objeto de tipo str, es decir, una estructura de datos que se carga en la memoria de nuestro ordenador y que representa la cadena de caracteres:
Una secuencia de dígitos decimales, separados del resto del código por uno o más espacios, representa un literal entero, a partir del cual Python crea un objeto del tipo int:
Para el resto de instancias de los tipos de datos básicos ocurre de forma similar:
La definición de literal nos ha permitido proporcionar otras informaciones útiles para comprender el significado de objeto. Python crea los objetos cuando el programa se está ejecutando, en el momento en que encuentra fragmentos de código a los cuales sabe que debe hacer corresponder estructuras de datos almacenados, representativas de dicho código. Por ejemplo, a partir de un simple fragmento de código, como el literal 'python', se crea en la memoria del ordenador una compleja estructura de datos, que no solo contiene los caracteres de la cadena de texto, sino también muchas otras informaciones, como el tipo de estructura de los datos:
Gracias a estas informaciones Python comprende cuáles son las acciones que puede llevar a cabo con estos datos:
Acabaremos diciendo que (obviamente) no es posible realizar asignaciones a literales:
Operadores
Los operadores son símbolos a los cuales Python asocia un significado que depende del tipo de sus operandos. Por ejemplo, el símbolo + es un operador. Cuando sus operandos son números, Python los suma, cuando son secuencias, los concatena y cuando no sabe cómo actuar, genera un error:
Otros ejemplos de operadores son los siguientes:
A lo largo de este libro explicaremos el significado de los distintos operadores.
Palabras clave
Como podemos intuir, las palabras clave (en inglés, keywords) son los vocablos del lenguaje interpretado por Python. Son exactamente como las palabras de un idioma, y sirven para explicar al intérprete lo que queremos que ejecute. La lista de palabras clave de Python es la siguiente:
No es posible cambiar el significado de una palabra clave, puesto que Python no entendería más vuestro código. Por esta razón las palabras clave no pueden aparecer a la izquierda del símbolo =:
Las palabras clave pertenecen a dos categorías, distintas según si su inicial es mayúscula o minúscula. Pertenecen a la primera categoría las palabras clave False, True y None. Estas son palabras clave especiales, puesto que, cuando el programa se está ejecutando, Python les asocia un objeto en memoria. Por ejemplo, a False le corresponde un objeto interpretado como el número cero, mientras que a True, un objeto interpretado como el número uno:
El resto de palabras clave no tienen ningún objeto asociado. Son simples palabras que deben ser usadas en el código siguiendo las normas de sintaxis del lenguaje, y no las podemos utilizar igual que el código al cual se ha asociado un objeto. Por ejemplo, no podemos obtener el tipo de palabra clave and, como con False, True y None:
Delimitadores
Los delimitadores son secuencias de uno, dos e incluso tres caracteres, que se utilizan para delimitar o separar fragmentos de código. Ya hemos encontrado algunos, como el signo dos puntos, utilizado para iniciar un bloque de código:
Otros conocidos delimitadores son:
• el signo igual, utilizado para la asignación:
• el punto, utilizado para acceder a un atributo:
• la coma y el punto y coma:
El resto de delimitadores los veremos cuando vayamos a utilizarlos en los ejemplos.
Las etiquetas
Todo lo que forma parte del código Python y no cabe en las precedentes categorías es una etiqueta. En el código siguiente, por ejemplo, aparece el literal entero 99, los delimitadores () y el texto print, que no es ni una palabra clave, ni un comentario, ni un signo de puntuación:
Por lo tanto, es una etiqueta. La carácterística de las etiquetas es que deben ser definidas antes de poder ser utilizadas, porque cuando el código se está ejecutando, Python les hace corresponder el objeto que se les ha asignado anteriormente. De hecho, si intentamos utilizar una etiqueta que no ha sido definida, Python genera un error:
Tened en cuenta que Python ha ejecutado la instrucción print(99) aunque no hayamos definido ninguna etiqueta print. Esta, de hecho, es una etiqueta ya definida por el lenguaje, a la cual se ha asignado un objeto del tipo builtin_function_or_method:
Para conocer las etiquetas de todos los objetos integrados podemos controlar los atributos del módulo builtins, de los cuales omitimos una parte por brevedad:
La principal diferencia entre las etiquetas, los literales y las palabras clave es que solo las etiquetas pueden aparecer a la izquierda del signo igual:
Las etiquetas que se pueden utilizar en un programa Python son, por tanto, las integradas más todos los identificadores a los cuales ha sido asignado un objeto, tanto en modo explícito mediante una instrucción de asignación como en modo implícito.
NOTA
Se habla de asignaciones implícitas cuando a una etiqueta se asigna un objeto sin utilizar explícitamente el signo igual. Por ejemplo, cuando llamamos a una función, los argumentos se asignan implícitamente a los parámetros:
Han sido ejecutadas implícitamente las asignaciones a = 1 y b = 2. Lo mismo ocurre cuando se importa un módulo:
La instrucción import procede a cargar en memoria el módulo y a asignarlo a la etiqueta math.
Probablemente ya hayamos oído decir que una diferencia fundamental entre Python 2 y Python 3, y una causa de incompatibilidad, es el modo en que se utiliza el identificador print. De hecho, en Python 2 print es una palabra clave y, por tanto, no puede ser asignada. :
mientras que en Python 3 es una simple etiqueta a la cual podemos asignar un objeto:
NOTA
Para descubrir los motivos por los cuales se ha decidido convertir print en una etiqueta, podemos consultar la PEP-3105, titulada Make print a function.
Otra diferencia entre etiquetas y palabras clave de Python 2 y Python 3 tiene que ver con True y False. Estas, de hecho, son palabras clave en Python 3, mientras que en Python 2 son simples etiquetas:
No podemos utilizar cualquier identificador para definir las etiquetas, sino que debemos seguir las normas. Sabemos, por ejemplo, que una etiqueta no puede corresponder a una palabra clave:
Además de este vínculo, las etiquetas no pueden contener operadores ni delimitadores:
no pueden empezar con números:
y son evaluadas por Python en modo case-sensitive:
En cuanto a las convenciones, es posible consultar la PEP-0008.
Cuando una etiqueta está precedida por el delimitador punto, se dice que está calificada. Por ejemplo, en la expresión sys.platform, decimos que platform es una etiqueta calificada, o también que platform está calificada mediante sys.
Si se desea profundizar en el argumento del análisis lexical del código Python, es aconsejable leer la siguiente página del sitio oficial: http://docs.python.org/3/reference/lexical_analysis.html.
Arquitectura de un programa Python
Un programa Python se compone de módulos, que contienen en su interior instrucciones, las cuales procesan expresiones. En esta sección, describiremos estos tres elementos.
Las expresiones
Hemos dicho que los objetos están generados por el código en ejecución. Tratamos de reducir el campo, individualizando los fragmentos de código que originan la creación de los objetos, o que simplemente se refieren a ellos. Estas partes de código se denominan expresiones. Esta es su definición: una expresión es un fragmento de código contenido en una línea lógica, que cuando el programa se está ejecutando se refiere a un objeto o bien lo genera.
Vamos a intentar entender, mediante ejemplos prácticos, cómo identificar las expresiones. Para ello, consideremos un código ejecutado correctamente, como el siguiente:
Reducimos el campo diciendo que las expresiones se encuentran a la derecha del signo igual y quedan encerradas en el interior de las líneas lógicas. Para descubrir si un fragmento de código es una expresión, podemos extrapolarlo de la línea lógica y asignarlo a una etiqueta. Si la asignación no genera ningún error, entonces el fragmento de código es una expresión; si no, no lo es.
En el proceso de extrapolación del código de la línea lógica, las etiquetas no pueden ser separadas de los paréntesis. Por lo tanto, print('python') no puede ser separada en las partes print y ('python'), y mylist[2] no puede ser dividida en mylist y [2]. Partimos de las cadenas 'p' y 'python':
Estas son expresiones. Veamos el fragmento de código obtenido a partir de su combinación mediante la palabra clave in:
Así, 'p' in 'python' también es una expresión. Veamos el fragmento de código if 'p':
Hemos obtenido un error, lo que significa que if 'p' no es una expresión. Ni la línea lógica por completo es una expresión:
así como el resto de fragmentos de código en el interior de esta línea. Vayamos a la segunda línea:
También print y ('python') son expresiones, pero, como ya hemos dicho, una etiqueta no puede ser separada de los paréntesis que la siguen, por lo cual print('python') es una única expresión y no la combinación de print y ('python'), las cuales, tomadas por separado, tienen su significado atómico:
La siguiente sintaxis define una expresión condicional:
Esta es su forma general:
y devuelve expresión 1 si la expresión test se valora como True; si no, devuelve expresión 2:
A diferencia de otros lenguajes, en Python la asignación no es una expresión:
El hecho de que la asignación no sea una expresión permite evitar que en una prueba de comparación (por ejemplo, a == b) la omisión de un carácter genere un peligroso error lógico (a = b). Encontramos los motivos de esta y otras opciones de diseño en la página http://docs.python.org/3/faq/design.html.
Para más información y detalles acerca de las expresiones y su clasificación, podemos consultar la documentación en el sitio oficial: http://docs.python.org/3/reference/expressions.html.
Las instrucciones
En Python, el código que define una línea lógica por completo se denomina instrucción simple (simple statement), mientras que un bloque de código compuesto por instrucciones simples se denomina instrucción compuesta (compound statement). Las instrucciones compuestas se carácterizan por el uso del delimitador dos puntos, el cual indica el inicio del bloque de código de la instrucción. La unión de las instrucciones simples y de las compuestas constituye el conjunto de las instrucciones de Python.
Las instrucciones tienen un nombre, que procede del de las palabras clave utilizadas en su interior. Por ejemplo, las instrucciones siguientes se denominan instrucción simple import e instrucción compuesta for:
En el transcurso del libro veremos cómo utilizar todas las instrucciones; en esta sección nos limitaremos a estudiar las que nos interesan para los objetivos de este capítulo.