¿Qué es E128 de PEP8: línea de continuación con sangría insuficiente para sangría visual?

298

Acabo de abrir un archivo con Sublime Text (con Sublime Linter) y noté un error de formato PEP8 que nunca había visto antes. Aquí está el texto:

urlpatterns = patterns('',
    url(r'^$', listing, name='investment-listing'),
)

Está marcando el segundo argumento, la línea que comienza url(...)

Estaba a punto de deshabilitar esta verificación en ST2, pero me gustaría saber qué estoy haciendo mal antes de ignorarlo. Nunca se sabe, si parece importante, incluso podría cambiar mis formas :)

Oli
fuente

Respuestas:

475

PEP-8 recomienda aplicar sangría a las líneas en los paréntesis de apertura si coloca algo en la primera línea, por lo que debe ser una sangría en el paréntesis de apertura:

urlpatterns = patterns('',
                       url(r'^$', listing, name='investment-listing'))

o no poner ningún argumento en la línea de inicio, luego sangrar a un nivel uniforme:

urlpatterns = patterns(
    '',
    url(r'^$', listing, name='investment-listing'),
)

urlpatterns = patterns(
    '', url(r'^$', listing, name='investment-listing'))

Sugiero que leas un PEP-8: puedes leer mucho y es bastante fácil de entender, a diferencia de algunos PEP más técnicos.

Gareth Latty
fuente
55
Alguien sabe por qué Django hace esto; ¿hay una buena razón? Parece que sería igual de fácil seguir a PeP-8.
TheHerk
66
Esto es tan omnipresente en el código de Django que he visto (además está en todos sus documentos) que posiblemente reemplaza a PEP-8, después de todo dice " Muchos proyectos tienen sus propias pautas de estilo de codificación. En caso de conflictos, tal proyecto -específicos guías tienen prioridad para ese proyecto " .
Nick T
66
@TheHerk la razón es que probablemente el primer argumento patterns()es único (un prefijo para todo lo demás especificado), y todos los demás argumentos son patrones de URL que son básicamente los mismos.
Nick T
66
@NickT Está leyendo mal PEP-8: PEP-8 recomienda seguir la convención existente donde un proyecto determinado lo usa, pero en este caso el código no va a Django, va a su proyecto usando Django, no es necesario para seguir su convención. El objetivo de esa regla es mantener la coherencia dentro de las bases de código.
Gareth Latty
25
Tenga en cuenta que PEP8 también establece que debe ignorar PEP8 donde tenga sentido hacerlo, y yo diría que en este caso tiene sentido. Siéntase libre de estar en desacuerdo para sus propios proyectos. En cualquier caso, esto pronto será un punto discutible ya que el uso patterns()quedará en desuso en Django 1.8: docs.djangoproject.com/en/dev/releases/1.8/…
Tom Carrick el
13

Esto también se aplica a declaraciones como esta (con formato automático de PyCharm):

    return combine_sample_generators(sample_generators['train']), \
           combine_sample_generators(sample_generators['dev']), \
           combine_sample_generators(sample_generators['test'])

Lo que dará la misma advertencia de estilo. Para deshacerme de él, tuve que volver a escribirlo en:

    return \
        combine_sample_generators(sample_generators['train']), \
        combine_sample_generators(sample_generators['dev']), \
        combine_sample_generators(sample_generators['test'])
nombre para mostrar
fuente
2
Prefiero el paréntesis sobre la barra invertida aquí, primero la línea return (, luego cada elemento retornable en su propia línea, sangrado, y finalmente el corchete de cierre en una línea separada, en el mismo nivel de sangría que el return. Editar: Me gusta esto pastebin.com/fAe7558X
Markus Meskanen
1
@MarkusMeskanen Sí, yo también. Solo quería señalar que ni siquiera el formato automático cumple totalmente con esta especificación.
mostrar