O que é o E128 do PEP8: linha de continuação sub-recuada para recuo visual?

298

Acabei de abrir um arquivo com Sublime Text (com Sublime Linter) e notei um erro de formatação PEP8 que eu nunca tinha visto antes. Aqui está o texto:

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

Está sinalizando o segundo argumento, a linha que começa url(...)

Eu estava prestes a desativar essa verificação no ST2, mas gostaria de saber o que estou fazendo de errado antes de ignorá-la. Você nunca sabe, se parece importante, posso até mudar meus modos :)

Oli
fonte

Respostas:

475

O PEP-8 recomenda que você recue as linhas entre parênteses de abertura se colocar alguma coisa na primeira linha; portanto, ela deve recuar no colchete de abertura:

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

ou não colocar argumentos na linha de partida e recuar para um nível uniforme:

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

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

Sugiro que você leia o PEP-8 - você pode ler muito sobre ele e é muito fácil de entender, ao contrário de alguns dos PEPs mais técnicos.

Gareth Latty
fonte
5
Alguém sabe por que o Django faz isso; existe uma boa razão? Parece que seria tão fácil seguir o PeP-8.
TheHerk 22/03
6
Isso é tão onipresente no código do Django que eu vi (além disso, está em toda a documentação deles) que, sem dúvida, substitui o PEP-8, afinal ele diz " Muitos projetos têm suas próprias diretrizes de estilo de codificação. No caso de qualquer conflito, esse projeto guias específicos têm precedência para esse projeto. "
Nick T
6
A lógica do @TheHerk é provavelmente que o primeiro argumento para patterns()é único (um prefixo para tudo o mais especificado), e todos os outros argumentos são padrões de URL que são basicamente os mesmos.
Nick T
6
@NickT Você está lendo mal PEP-8 - O PEP-8 recomenda seguir a convenção existente em que um determinado projeto o usa - mas, neste caso, o código não está entrando no Django, está entrando no seu projeto usando o Django - não há necessidade seguir sua convenção. O objetivo dessa regra é manter a consistência dentro das bases de código.
Gareth Latty 17/05
25
Observe que o PEP8 também afirma que você deve ignorar o PEP8 onde faz sentido, e eu argumentaria que, nesse caso, faz sentido. Sinta-se livre para discordar de seus próprios projetos. De qualquer forma, isso será em breve um ponto discutível, já que o uso patterns()será descontinuado no Django 1.8: docs.djangoproject.com/en/dev/releases/1.8/…
Tom Carrick
13

Isso vale também para declarações como esta (formatadas automaticamente pelo PyCharm):

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

O que dará o mesmo aviso de estilo. Para me livrar dele, tive que reescrevê-lo para:

    return \
        combine_sample_generators(sample_generators['train']), \
        combine_sample_generators(sample_generators['dev']), \
        combine_sample_generators(sample_generators['test'])
Nome em Exibição
fonte
2
Eu prefiro parênteses sobre barra invertida aqui, sendo a primeira linha return (, então cada item retornável em sua própria linha, recuado e, finalmente, o colchete de fechamento em uma linha separada, no mesmo nível de recuo return. Edit: Like this pastebin.com/fAe7558X
Markus Meskanen
1
@MarkusMeskanen Sim, eu também. Eu só queria salientar que nem mesmo o formato automático está em conformidade com essa especificação.
displayname