linhas longas no código

7,230 views
Skip to first unread message

Luiz Gustavo Costa

unread,
Dec 26, 2012, 3:05:50 PM12/26/12
to python...@googlegroups.com
Boa tarde lista.

Uma questão que fica sempre inerente na minha cabeça é a quebra de linha
de loop's if e outros...

Eu sei que a sintaxe não deixa de funcionar, mas deixar uma linha muito
longa (acima de 80 colunas) quebra uma regra de código.

A pergunta é, como quebrar a linha em situações assim:

Exemplo:

if (crypt.crypt(flask.request.form['senha'],pwd.getpwnam(flask.request.form['login'])[1])) == (pwd.getpwnam(flask.request.form['login'])[1]):

ou

for ips in modelos.db.session.query(modelos.Endereco_ip).filter(modelos.Endereco_ip.id_nic == iface.id).all():

Eu sei que poderia jogar as queries em variveis.. mas eu "incho" mais o
meu código. Ainda não me acostumei a programar assim.

Talvez os exemplos que dei nem sejam tão dificieis... mas volta e meia
pego um aqui mais brabo :(

Outro detalhe é a identanção... eu normalmente uso 4 espaços... mas as
vezes fico com pouco espaço para código sobrando.

Enfim... alguém indica algum material em relação a essas questões que
falei ?

Abraços.

---
Luiz Gustavo Costa (Powered by BSD)
*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
mundoUnix - Consultoria em Software Livre
http://www.mundounix.com.br
ICQ: 2890831 / MSN: con...@mundounix.com.br
Tel: 55 (21) 4063-7110 / 8194-1905 / (11) 4063-0407
Blog: http://www.luizgustavo.pro.br

Lucas Klassmann

unread,
Dec 26, 2012, 3:26:09 PM12/26/12
to python...@googlegroups.com
Luiz,

Eu aconselho sempre a ler o PEP08 a todos que tenham dúvidas sobre layout de código, mas acredito que você conheça.

Existem claro, situações onde não encontramos exemplos tão claros de como programar, o negócio é sempre perguntar mesmo.

Eu particularmente faço do jeito que você comentou, separo cada problema em variaveis separadas para dar mais clareza e evitar esses tipos de situações onde as condições ficam enormes, até mesmo quando você tem a situação de ter que fazer vários AND e OR o que aumenta ainda mais o tamanho do teste de condição do IF por exemplo.

Um caso que acontece:

if aluno.idade < 18 and aluno.matriculado and aluno.pagamento_em_dia():
    fazer_alguma_coisa()

Eu faria:

aluno_valido = aluno.idade < 18 and aluno.matriculado and aluno.pagamento_em_dia()

if aluno_valido:
    fazer_alguma_coisa()

Claro que meu exemplo é tosco, mas dá pra entender.

Eu programo desta forma, depois de ler vários livros e exemplo de autores que mostravam como simplificar a leitura do código, nós poderiamos ter feito ainda melhor, na classe do aluno eu poderia ter um método que já verifica isso pra mim, dai ficaria mais simples e um código reutilizável:


if aluno.valido_para_cursar():
    fazer_alguma_coisa()


E eu tentei simplificar os seus exemplos:

## IF

encriptar = crypt.crypt
form_senha = flask.request.form['senha']
form_login = flask.request.form['login']
pwd_senha = pwd.getpwnam(form_login)[1]

encriptado = encriptar(form_senha, pwd_senha)

if encriptado == (pwd.getpwnam(flask.request.form['login'])[1]):

## FOR
query_session = modelos.db.session.query(modelos.Endereco_ip)
enderecos  = query_session.filter(modelos.Endereco_ip.id_nic == iface.id).all()

for ips in enderecos:

Bom, espero ter ajudado.

Abraço.

--
Lucas Klassmann

Luiz Gustavo Costa

unread,
Dec 26, 2012, 3:35:13 PM12/26/12
to python...@googlegroups.com
* Lucas Klassmann (lucaskl...@gmail.com) wrote:
> Luiz,
>
> Eu aconselho sempre a ler o PEP08
> <http://www.python.org/dev/peps/pep-0008/>a todos que tenham dúvidas
> sobre layout de código, mas acredito que você
> conheça.

Maravilha, é exatamente isso que quero seguir

>
> Existem claro, situações onde não encontramos exemplos tão claros de como
> programar, o negócio é sempre perguntar mesmo.
>
> Eu particularmente faço do jeito que você comentou, separo cada problema em
> variaveis separadas para dar mais clareza e evitar esses tipos de situações
> onde as condições ficam enormes, até mesmo quando você tem a situação de
> ter que fazer vários AND e OR o que aumenta ainda mais o tamanho do teste
> de condição do IF por exemplo.
>

Exatamente, mas se eu quebro um AND ou OR, eu tenho erro de sintaxe:

if jose = 1 AND maria = 2 AND manuel = 4 OR
ALL = 10:

Isso me gera erro de sintaxe.

> E eu tentei simplificar os seus exemplos:
>

Eu fui infeliz nos exemplos... eles são bem fáceis de quebrar a linha :)
.. eu vou achar um aqui que tive dificuldade e mando aqui nessa thread.


> ## IF
>
> encriptar = crypt.crypt
> form_senha = flask.request.form['senha']
> form_login = flask.request.form['login']
> pwd_senha = pwd.getpwnam(form_login)[1]
>
> encriptado = encriptar(form_senha, pwd_senha)
>
> if encriptado == (pwd.getpwnam(flask.request.form['login'])[1]):
>
> ## FOR
> query_session = modelos.db.session.query(modelos.Endereco_ip)
> enderecos = query_session.filter(modelos.Endereco_ip.id_nic == iface.id
> ).all()
>
> for ips in enderecos:
>
> Bom, espero ter ajudado.
>
> Abraço.
>
> --
> Lucas Klassmann
>

Douglas Camata

unread,
Dec 26, 2012, 3:37:52 PM12/26/12
to python...@googlegroups.com
Uma dica, eu eliminaria longas chamadas de métodos consecutivas em objetos. Você acaba ficando perdido sobre o resultado de cada chamada futuramente, assim como o Lucas mostrou nos últimos exemplos. Vai te ajudar bastante a continuar entendendo seu código depois de um tempo.


2012/12/26 Luiz Gustavo Costa <luizg...@luizgustavo.pro.br>
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar

<*> Para visitar o site do grupo na web, acesse:
    http://groups.google.com/group/python-brasil

<*> Para sair deste grupo, envie um e-mail para:
    python-brasi...@googlegroups.com






--
Douglas Camata
Graduando em Ciência da Computação (UENF)

Skype: douglas_camata
-----------------------------------
Linux User #509211

Luiz Gustavo Costa

unread,
Dec 26, 2012, 3:42:13 PM12/26/12
to python...@googlegroups.com
Esse é um exemplo:

proxy_bind = []
if modelos.ConfigCache.query.first().bind_interface:
for bind in modelos.ConfigCache.query.first().bind_interface.split(
';'
)[:-1]:

Eu quebrei a linha:
for bind in modelos.ConfigCache.query.first().bind_interface.split(';')[:-1]:

Eu consegui encaixar nas 80 colunas, mas olha como ficou feio :(

Se não tiver jeito, vou criando variaveis mesmo:

ConfigCache = modelos.ConfigCache.query.first().bind_interface.split(';')[:-1]
for bind in ConfigCache:


Obrigado !

Douglas Camata

unread,
Dec 26, 2012, 3:43:26 PM12/26/12
to python...@googlegroups.com
cache_config_interface = modelos.ConfigCache.query.first().bind_interface

for bind in cache_config_interface.split(';')[:-1]:
....


Isso já da uma ajudada. Como eu disse na mensagem anterior, tente quebrar essas chamadas sucessivas de métodos em outras variáveis com nome bem descritivos.




--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar

<*> Para visitar o site do grupo na web, acesse:
    http://groups.google.com/group/python-brasil

<*> Para sair deste grupo, envie um e-mail para:
    python-brasi...@googlegroups.com



Luiz Armesto

unread,
Dec 26, 2012, 3:51:47 PM12/26/12
to python...@googlegroups.com
2012/12/26 Luiz Gustavo Costa <luizg...@luizgustavo.pro.br>
[corta]

Exatamente, mas se eu quebro um AND ou OR, eu tenho erro de sintaxe:

if jose = 1 AND maria = 2 AND manuel = 4 OR
    ALL = 10:

Isso me gera erro de sintaxe.

[corta]

Você tem duas opções para evitar erro de sintaxe em casos como esse: contrabarra ou parênteses. De preferência a segunda opção.

if jose == 1 and maria == 3 and manuel == 4 or \
   all == 10:

ou 

if (jose == 1 and maria == 3 and manuel == 4 or
    all == 10):

--
Luiz Armesto

Lucas Klassmann

unread,
Dec 26, 2012, 4:03:44 PM12/26/12
to python...@googlegroups.com
Seu exemplo anterior do josé :)

http://pastebin.com/Bq8Qz28w

Outra coisa é seu ultimo exemplo:

http://pastebin.com/kNRcm82T

Eu procuro não utilizar o corte de array, strings junto com a chamada de métodos, ao meu ver acaba ficando um código de dificil leitura.

Abraço.
--
Lucas Klassmann

Luiz Gustavo Costa

unread,
Dec 26, 2012, 4:11:09 PM12/26/12
to python...@googlegroups.com
* Lucas Klassmann (lucaskl...@gmail.com) wrote:
Melhor impossivel !

Obrigado pela as dicas.

Danilo J. S. Bellini

unread,
Dec 26, 2012, 4:09:40 PM12/26/12
to python-brasil
Para quebrar a linha apenas "fisicamente", deixe um parêntesis, colchete ou chave sem fechar, ou termine a linha com "\". Adicionalmente, "and" e "or" devem estar em minúsculas.

Eu indento com 2 espaços exatamente por achar 4 espaços do PEP8 um desperdício, e tb por que tento sempre evitar passar dos 79 caracteres por linha.

Para o segundo caso, você poderia fazer:

for ips in (modelos.db.session.query(modelos.Endereco_ip)
.filter(modelos.Endereco_ip.id_nic == iface.id)

.all()

):


Alinhando as duas linhas do meio com o ponto do ".query", talvez comentando oportunamente. Eu costumo alinhar parêntesis/colchete/chave de início com o de fim quanto preciso de muitas linhas (e.g. testes parametrizados no pytest, chaves em definição de dicionários, etc.), mas você poderia manter o final na mesma linha do .all(). Quanto a atribuições intermediárias, os argumentos me preocuparam ("modelos.Endereco_ip" aparece duas vezes, uma condição de seleção mais complicada poderia ficar enorme), mas não tanto o aninhamento de query, filter e all. Outra opção, parecida:


for ips in modelos.db.session.query(modelos.Endereco_ip) \
.filter(modelos.Endereco_ip.id_nic == iface.id) \

.all():


ou então, usando variáveis intermediárias para os argumentos:


ipaddr = modelos.Endereco_ip

cond = ipaddr.id_nic == iface.id

for ips in modelos.db.session.query(ipaddr).filter(cond).all():


Danilo J. S. Bellini
---------------
"It is not our business to set up prohibitions, but to arrive at conventions." (R. Carnap)

d4n1

unread,
Dec 26, 2012, 4:56:42 PM12/26/12
to python...@googlegroups.com

Além de tentar seguir a pep8 (ninja-ide já tem integrado ou você pode instalar plugins ou instalar a própria pep8: pip install pep8. E usar ela em seu código: pep8 seu_código.py), você pode usar a contrabarra, usar parêntese e aninhar de acordo com os parêntese também é uma boa solução também.
A pep8 está disponível para FreeBSD também grande Guga -:)

Daniel Melo (d4n1)

Welson de Avelar Soares Filho

unread,
Jan 2, 2013, 8:29:14 AM1/2/13
to Python Brasil - Lista
Engraçado...eu nunca passei por situação assim em Python.
Eu venho do C e lá eu acostumei, durante a graduação inteira, a sempre usar parenteses. Em Python faço o mesmo e quando quebro a linha, não dá estes erros. Achei legal este uso da contra-barra. :D

Abraço.


Welson de Avelar Soares Filho
Juiz de Fora - Minas Gerais

Luciano Ramalho

unread,
Jan 2, 2013, 8:45:11 AM1/2/13
to python...@googlegroups.com
2013/1/2 Welson de Avelar Soares Filho <welson...@yahoo.com.br>:
> Engraçado...eu nunca passei por situação assim em Python.
> Eu venho do C e lá eu acostumei, durante a graduação inteira, a sempre usar
> parenteses. Em Python faço o mesmo e quando quebro a linha, não dá estes
> erros. Achei legal este uso da contra-barra. :D


Na verdade, não é legal usar a contra-barra, porque o efeito dela é
"escapar" o próximo caractere. Veja a diferença:

a\
b

a\
b

não conseguiu ver? Este é exatamente o problema!

No primeiro caso a contrabarra vem seguida da quebra de linha,
anulando-a. O efeito é como se tivéssemos:

a b

No segundo caso há um espaço em branco após a contrabarra, e ele é
anulado, mas não a quebra de linha. O efeito é igual a:

a
b

Por esse motivo eu nunca uso \.

Uso parêntesis ou divido a expressão em expressões menores para evitar
linhas longas demais.

[ ]s
Luciano
Luciano Ramalho / OFICINAS TURING
Twitter: @ramalhoorg

Autor e professor dos cursos:

* Objetos Pythonicos --> http://turing.com.br/oopy
* Python para quem sabe Python --> http://turing.com.br/ppqsp

Luciano Ramalho

unread,
Jan 2, 2013, 8:47:20 AM1/2/13
to python...@googlegroups.com
O gmail retirou o espaço em branco invísivel que eu coloquei depois do
segundo a\. Mesmo assim, acho que dá para entender a explicação.

Resumo: não é uma boa idéia usar \ para continuar linhas em Python.

[ ]s
Luciano

2013/1/2 Luciano Ramalho <luc...@ramalho.org>:

Luiz Gustavo Costa

unread,
Jan 2, 2013, 9:00:49 AM1/2/13
to python...@googlegroups.com
* Welson de Avelar Soares Filho (welson...@yahoo.com.br) wrote:
> Engraçado...eu nunca passei por situação assim em Python.
> Eu venho do C e lá eu acostumei, durante a graduação inteira, a sempre usar
> parenteses. Em Python faço o mesmo e quando quebro a linha, não dá estes
> erros. Achei legal este uso da contra-barra. :D
>

Verdade, dicas maravilhosas, eu estou me habituando a ficar nas 80
colunas, principalmente em strings grandes, fazendo uso maior das 3
aspas e quebrando as linhas com \

quanto ao for/if, me ajudou bastante também, mas realmente eu também
acho "visualmente falando" o uso dos parenteses melhor.

eu também estou me habituando a usar a forma mais simples de for, como
no exemplo abaixo:

valor = [ _x for _x in bd['cadastro'] if _x = "jose" ]

To gostando dessas coisas, ficou muito melhor para eu visualizar o
código.

Obrigado a lista !! maravilhosa por sinal !


>
> > Além de tentar seguir a pep8 (ninja-ide já tem integrado ou você pode
> > instalar plugins ou instalar a própria pep8: pip install pep8. E usar ela
> > em seu código: pep8 seu_código.py), você pode usar a contrabarra, usar
> > parêntese e aninhar de acordo com os parêntese também é uma boa solução
> > também.

Então Daniel,

eu to usando o komodo edit e to gostando muito mesmo dele. foi o que eu
melhor me adaptei. lá eu to usando o pylint, eu acho o pep8 muito chato.

> > A pep8 está disponível para FreeBSD também grande Guga -:)

Certeza... FreeBSD rulez nos códigos aqui :)

o komodo edit tá la no ports também... apesar de rodar emulado em linux,
funciona tão bem ou melhor que no mesmo.

> >
> > Daniel Melo (d4n1)

Abraços e

Feliz 2013 a todos !

Joao S. O. Bueno

unread,
Jan 2, 2013, 9:06:39 AM1/2/13
to python...@googlegroups.com
2013/1/2 Luciano Ramalho <luc...@ramalho.org>:
> O gmail retirou o espaço em branco invísivel que eu coloquei depois do
> segundo a\. Mesmo assim, acho que dá para entender a explicação.
>
> Resumo: não é uma boa idéia usar \ para continuar linhas em Python.

Eu tmabem nao costumava usar em lugar nenhum - semrpe
preferindo um par de parenteses a mais.

mas tem casos em que é necessária a contrabarra -
por exemplo, em with statements que fiquem muito
longos.

No que estou fazendo este mês, tenho usado as contrabarras
de forma mais consistente em if's e vendoq ue nem são tão
ruins assim.
(é, tem que tomar cuidado com whitespace, mas se ele sair errado,
dá um erro de sintaxe, exatamente como um erro de whitespace na
indentação - não é tão patológico)


js
-><-

Danilo J. S. Bellini

unread,
Jan 2, 2013, 11:50:37 AM1/2/13
to python-brasil
O Spyder tem um recurso "Automatically remove trailing spaces when saving files" que evita esse problema.
A parte que não gosto com essa forma de quebrar linhas (com "\") é que não dá para fazer comentários na própria linha.
Reply all
Reply to author
Forward
0 new messages