2010-01-09 18 views
26

Decidí que aprendí un poco de Python. La primera introducción dice que usa sangría a declaraciones grupales. Si bien el mejor hábito es claramente usar solo uno de estos, ¿qué sucede si los intercambio? ¿Cuántos espacios se considerarán equivalentes a una pestaña? ¿O fallará si las pestañas y los espacios se mezclan?Interpretación de Python de pestañas y espacios para sangrar

Respuesta

32

Los espacios no se consideran equivalentes a la pestaña. Una línea sangrada con una pestaña está en una sangría diferente de una línea sangrada con 1, 2, 4 o 8 espacios.

prueba por contraejemplo (! errónea, o, a lo sumo, limitado - tab = 4 espacios):

x = 1 
if x == 1: 
^Iprint "fff\n" 
    print "yyy\n" 

El '^I' muestra una TAB. Cuando se ejecuta a través de Python 2.5, consigo el error:

File "xx.py", line 4 
    print "yyy\n" 
       ^
IndentationError: unindent does not match any outer indentation level 

lo tanto mostrando que en Python 2.5, las pestañas no son iguales a los espacios (y en particular no es igual a 4 espacios).


Oops - averrassing; mi prueba con el contraejemplo muestra que las pestañas no son equivalentes a 4 espacios. Como Alex Martelli señala en un comment, en Python 2, las pestañas son equivalentes a 8 espacios, y la adaptación del ejemplo con una pestaña y 8 espacios muestra que este es realmente el caso.

x = 1 
if x != 1: 
^Iprint "x is not 1\n" 
     print "y is unset\n" 

En Python 2, este código funciona y no imprime nada.


En Python 3, las reglas son ligeramente diferentes (como noted por Antti Haapala). Compare:

Python 2 dice:

First, tabs are replaced (from left to right) by one to eight spaces such that the total number of characters up to and including the replacement is a multiple of eight (this is intended to be the same rule as used by Unix). The total number of spaces preceding the first non-blank character then determines the line’s indentation. Indentation cannot be split over multiple physical lines using backslashes; the whitespace up to the first backslash determines the indentation.

Python 3 dice:

Tabs are replaced (from left to right) by one to eight spaces such that the total number of characters up to and including the replacement is a multiple of eight (this is intended to be the same rule as used by Unix). The total number of spaces preceding the first non-blank character then determines the line’s indentation. Indentation cannot be split over multiple physical lines using backslashes; the whitespace up to the first backslash determines the indentation.

(Aparte de la apertura WOR d "En primer lugar," éstos son idénticos)

Python 3 añade un párrafo adicional:.

Indentation is rejected as inconsistent if a source file mixes tabs and spaces in a way that makes the meaning dependent on the worth of a tab in spaces; a TabError is raised in that case.

Esto significa que el ejemplo TAB vs 8-espacio que trabajó en Python 2 generaría una TabError en Python 3. Lo mejor es necesario en Python 3 para garantizar que la secuencia de caracteres que componen la sangría en cada línea de un bloque sea idéntica. PEP8 dice 'use 4 espacios por nivel de sangría'. (Los estándares de codificación de Google dicen 'usar 2 espacios'.)

+9

Desafortunadamente, las pestañas se consideran equivalentes a espacios, específicamente, ocho espacios, como lo dicen los documentos con bastante claridad. Nunca se recomienda mezclar pestañas y espacios, pero es necesario ejecutar Python con '-t' (o' -tt') para obtener advertencias (o errores) por violaciones de dicha mejor práctica. –

+5

La [Referencia del lenguaje Python] (http://docs.python.org/2/reference/lexical_analysis.html#indentation) dice: 'Primero, las pestañas se reemplazan (de izquierda a derecha) por uno a ocho espacios como que el número total de caracteres hasta e incluyendo el reemplazo es un múltiplo de ocho (esta es la misma regla que usa Unix). El número total de espacios que preceden al primer carácter que no está en blanco determina entonces la sangría de la línea' – gkcn

+0

Lo anterior, y esta respuesta, solo se aplica a ** Python 2 **. –

2

4 espacios son una sola pestaña (en mi configuración) pero, hasta donde yo sé, no se intercambian. puede usar espacios o pestañas. no ambos.

+2

No necesariamente. Eso depende de tu configuración. –

5

Simplemente no los intercambie :)
Configure su IDE/editor para ingresar 4 espacios al presionar "tab" y ya está listo para comenzar.

5

Yo recomendaría que vaya a través de http://www.python.org/dev/peps/pep-0008/ que es la guía de estilo de pitón 'oficial' para el código de Python. Cubre (entre otras cosas) el uso de pestañas/espacios.

18

Siga PEP 8 para el estilo de Python. PEP 8 dice: sangría

Use 4 spaces per indentation level.

For really old code that you don't want to mess up, you can continue to use 8-space tabs.

tabuladores o espacios?

Never mix tabs and spaces.

The most popular way of indenting Python is with spaces only. The second-most popular way is with tabs only. Code indented with a mixture of tabs and spaces should be converted to using spaces exclusively. When invoking the Python command line interpreter with the -t option, it issues warnings about code that illegally mixes tabs and spaces. When using -tt these warnings become errors. These options are highly recommended!

+0

enlace actual de PEP8 es esto: http://legacy.python.org/dev/peps/pep-0008/ por favor considere actualizar la respuesta. Gracias – kmonsoor

-1

Creo que el carácter de tabulación simplemente nunca debería aparecer en el código fuente bajo ninguna circunstancia. No tiene ninguna ventaja y es una fuente interminable de pequeños errores. - use una cadena de caracteres con \ t si necesita una pestaña, tiene la ventaja de que se autodetecta.

Here es el artículo clásico sobre pestañas vs espacios - Utilizo una variante de elisp de jwz en mi propio archivo .emacs.

(confieso a romper personalmente con PEP 8 mediante el uso de la sangría sólo 2 caracteres - 4 personajes es mucho cuando sus líneas son sólo 80 caracteres ...)

8

En Python 2, la interpretación de TAB es como si se convirtiera en espacios usando las pestañas de 8 espacios (como ya lo habían proporcionado las respuestas anteriores); es decir que cada TAB promueve la indentación con 1 a 8 espacios para que la indentación resultante es divisible por 8.

Sin embargo, esto no se aplica a Python 3 más - en Python 3 mixing of spaces and tabs are always an error - pestañas solamente coincide con pestañas y espacios único partido otros espacios en sangría; que es una línea de sangría con TABSPACESPACE pueden contener también líneas con sangría con SPACESPACETAB; y podría contener un bloque sangrado sangría con TABESPACIOESPACIOTAB, pero si el bloque sangrado contenía TABTAB, sería considerado un error sangría, a pesar de que el bloque aparentemente haría ampliar más:

Indentation is rejected as inconsistent if a source file mixes tabs and spaces in a way that makes the meaning dependent on the worth of a tab in spaces; a TabError is raised in that case.

Ieel algoritmo funciona como sigue:

  • si tanto número de pestañas y número de espacios coincide con la línea anterior (no importa el orden), entonces esta línea pertenece al mismo bloque con la línea anterior

  • si el número de uno de (pestañas, espacios) es mayor que en la línea anterior y el número de la otra es al menos igual a los de la línea anterior, este es un bloque sangrado

  • la tupla (tabs, spaces) partidos una sangría de un bloque anterior - th Dede a ese bloque

  • de lo contrario IndentationError o TabError se plantea.

Esta es la razón por la mezcla de tabuladores y espacios, o incluso el uso de pestañas para el sangrado en absoluto sería considerado una muy mala práctica en Python.

Cuestiones relacionadas