variáveis

classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|

variáveis

DPL-2
Bem sr.. estou começando no Python e surgiu essa dúvida

tenho que valor que vem de um banco de dados

data=row["data"]


Quando a data estiver vazia quero substituir por uma data definida

if data== None:
        data =='2008-01-01'
else:
        data == data


Mas não subtstitui quando a da é None


o que tem de errado nesse codigo??

Reply | Threaded
Open this post in threaded view
|

Re: variáveis

Henr"Ikke" Pereira
2008/12/19 DPL <[hidden email]>:

> Bem sr.. estou começando no Python e surgiu essa dúvida
>
> tenho que valor que vem de um banco de dados
>
> data=row["data"]
>
> Quando a data estiver vazia quero substituir por uma data definida
>
> if data== None:
> data =='2008-01-01'
> else:
> data == data
>
> Mas não subtstitui quando a da é None
>
> o que tem de errado nesse codigo??

Acho que tu confundiu o uso dos =.

= é atribuição.
>>> a = 5
>>> b = 6

== é comparaçãoo
>>> a == b
False




>
>



--
Henr"Ikke" G.G. Pereira
|_|0|_|
|_|_|0|
|0|0|0|
Reply | Threaded
Open this post in threaded view
|

Re: variáveis

Adam Victor Nazareth Brandizzi
In reply to this post by DPL-2
2008/12/19 DPL <[hidden email]>:

> Bem sr.. estou começando no Python e surgiu essa dúvida
>
> tenho que valor que vem de um banco de dados
>
> data=row["data"]
>
>
> Quando a data estiver vazia quero substituir por uma data definida
>
> if data== None:
>        data =='2008-01-01'
> else:
>        data == data
>
>
> Mas não subtstitui quando a da é None
>
>
> o que tem de errado nesse codigo??

"==" é operador de comparação. O operador de atribuição deve ser "="

Além disso, o "else" que você colocou não tem nenhuma utilidade, e eu
recomendaria fortemente retirá-lo. O resultado seria

>>> if data== None:
>>>       data = '2008-01-01'




>
> ------------------------------------
>
> ,-----------------------------------------------------------.
> | Antes de enviar um e-mail para o grupo leia:              |
> | http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar  |
> | E se você é usuário do BOL lembre-se de cadastrar o       |
> | e-mail do grupo na lista branca do seu sistema anti-spam. |
> `-----------------------------------------------------------´Links do Yahoo! Grupos
>
>
>



--
Adam Victor Nazareth Brandizzi
http://brandizzi.googlepages.com/
Reply | Threaded
Open this post in threaded view
|

Re: variáveis

Rodolfo S. Carvalho
2008/12/19 Adam Victor Nazareth Brandizzi <[hidden email]>:

> 2008/12/19 DPL <[hidden email]>:
>> Bem sr.. estou começando no Python e surgiu essa dúvida
>>
>> tenho que valor que vem de um banco de dados
>>
>> data=row["data"]
>>
>>
>> Quando a data estiver vazia quero substituir por uma data definida
>>
>> if data== None:
>> data =='2008-01-01'
>> else:
>> data == data
>>
>>
>> Mas não subtstitui quando a da é None
>>
>>
>> o que tem de errado nesse codigo??
>
> "==" é operador de comparação. O operador de atribuição deve ser "="
>
> Além disso, o "else" que você colocou não tem nenhuma utilidade, e eu
> recomendaria fortemente retirá-lo. O resultado seria
>
>>>> if data== None:
>>>> data = '2008-01-01'

Ou melhor ainda:
|
|if data is None:
|....data = '2008-01-01'
|

Ou ainda:
|
|if not data:
|....data = '2008-01-01'
|

>
>>
>> ------------------------------------
>>
>> ,----------------------------------------------------------.
>> | Antes de enviar um e-mail para o grupo leia: |
>> | http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar |
>> | E se você é usuário do BOL lembre-se de cadastrar o |
>> | e-mail do grupo na lista branca do seu sistema anti-spam. |
>> `----------------------------------------------------------´Links do
>> Yahoo! Grupos
>>
>>
>>
>
> --
> Adam Victor Nazareth Brandizzi
> http://brandizzi.googlepages.com/
>



--
    Rodolfo Carvalho
     Web Developer
[hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: variáveis

Leonardo Santagada
In reply to this post by Adam Victor Nazareth Brandizzi

On Dec 19, 2008, at 3:38 PM, Adam Victor Nazareth Brandizzi wrote:

> 2008/12/19 DPL <[hidden email]>:
>> Bem sr.. estou começando no Python e surgiu essa dúvida
>>
>> tenho que valor que vem de um banco de dados
>>
>> data=row["data"]
>>
>>
>> Quando a data estiver vazia quero substituir por uma data definida
>>
>> if data== None:
>>       data =='2008-01-01'
>> else:
>>       data == data
>>
>>
>> Mas não subtstitui quando a da é None
>>
>>
>> o que tem de errado nesse codigo??
>
> "==" é operador de comparação. O operador de atribuição deve ser "="
>
> Além disso, o "else" que você colocou não tem nenhuma utilidade, e eu
> recomendaria fortemente retirá-lo. O resultado seria
>
>>>> if data== None:
>>>>      data = '2008-01-01'


O mais correto é ver se o valor é None e não se ele é igual a None,  
então:

if data is None

Alguém também falou para usar o not data, o problema é que isso  
transforma data que nesse caso é uma string ou None em um valor  
booleano e tanto None quanto a string vazia (ex: '') são valores que  
resultam em falso. Se esse é o comportamente esperado tudo bem, mas  
"if data is None" não é a mesma coisa que "if not data".

[]'s
--
Leonardo Santagada
santagada at gmail.com



Reply | Threaded
Open this post in threaded view
|

Re: variáveis

Iuri Diniz
In reply to this post by Rodolfo S. Carvalho
data=row["data"]

--------

data = row["data"] if not row["data"] else '2008-01-01'

2008/12/19 Rodolfo S. Carvalho <[hidden email]>

>   2008/12/19 Adam Victor Nazareth Brandizzi <[hidden email]<brandizzi%40gmail.com>
> >:
>
> > 2008/12/19 DPL <[hidden email] <daniel.pm.lima%40gmail.com>>:
> >> Bem sr.. estou começando no Python e surgiu essa dúvida
> >>
> >> tenho que valor que vem de um banco de dados
> >>
> >> data=row["data"]
> >>
> >>
> >> Quando a data estiver vazia quero substituir por uma data definida
> >>
> >> if data== None:
> >> data =='2008-01-01'
> >> else:
> >> data == data
> >>
> >>
> >> Mas não subtstitui quando a da é None
> >>
> >>
> >> o que tem de errado nesse codigo??
> >
> > "==" é operador de comparação. O operador de atribuição deve ser "="
> >
> > Além disso, o "else" que você colocou não tem nenhuma utilidade, e eu
> > recomendaria fortemente retirá-lo. O resultado seria
> >
> >>>> if data== None:
> >>>> data = '2008-01-01'
>
> Ou melhor ainda:
> |
> |if data is None:
> |....data = '2008-01-01'
> |
>
> Ou ainda:
> |
> |if not data:
> |....data = '2008-01-01'
> |
> >
> >>
> >> ------------------------------------
> >>
> >> ,----------------------------------------------------------.
> >> | Antes de enviar um e-mail para o grupo leia: |
> >> | http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar |
> >> | E se você é usuário do BOL lembre-se de cadastrar o |
> >> | e-mail do grupo na lista branca do seu sistema anti-spam. |
> >> `----------------------------------------------------------´Links do
> >> Yahoo! Grupos
> >>
> >>
> >>
> >
> > --
> > Adam Victor Nazareth Brandizzi
> > http://brandizzi.googlepages.com/
> >
>
> --
> Rodolfo Carvalho
> Web Developer
> [hidden email] <rodolfo.ueg%40gmail.com>
>  
>



--
Iuri Diniz
http://iuridiniz.com [Sou um agitador, não um advogado]
http://blog.igdium.com [Linux on Limbo]


[As partes desta mensagem que não continham texto foram removidas]

Reply | Threaded
Open this post in threaded view
|

Re: variáveis

Hugo Lopes Tavares
Esse if/else inline é meio perigoso quanto à versões do Python...
Tem uma maneira mais elegante ainda do que esse if/else inline pra esse
caso:
 data = row['data'] or '2008-01-01'
simples, não!?
(não li a thread inteira, posso ter cometido algum engano quanto ao intuito
original, mas essa mensagem é baseada apenas no codigo da mensagem acima)

Eu já tive problemas com esse if/else inline quando fui rodar um código e o
python do sistema era 2.4...

PS.: esses and/or podem parecer confusos quando não se trata apenas de
logica booleana, mas quando voce entende como funciona, fica simples. Tem um
amigo (Gustavo Rezende) que diz que nunca usaria um codigo do tipo, por
legibilidade:
 variavel = expressao and valor1 or valor2, que "simularia" um operador
ternário

Fica a critério, são "hacks" :-)

2009/1/9 Iuri Diniz <[hidden email]>

>   data=row["data"]
>
> --------
>
> data = row["data"] if not row["data"] else '2008-01-01'
>
> 2008/12/19 Rodolfo S. Carvalho <[hidden email]<rodolfo.ueg%40gmail.com>
> >
>
> > 2008/12/19 Adam Victor Nazareth Brandizzi <[hidden email]<brandizzi%40gmail.com>
> <brandizzi%40gmail.com>
> > >:
> >
> > > 2008/12/19 DPL <[hidden email] <daniel.pm.lima%40gmail.com><daniel.pm.lima%
> 40gmail.com>>:
>
> > >> Bem sr.. estou começando no Python e surgiu essa dúvida
> > >>
> > >> tenho que valor que vem de um banco de dados
> > >>
> > >> data=row["data"]
> > >>
> > >>
> > >> Quando a data estiver vazia quero substituir por uma data definida
> > >>
> > >> if data== None:
> > >> data =='2008-01-01'
> > >> else:
> > >> data == data
> > >>
> > >>
> > >> Mas não subtstitui quando a da é None
> > >>
> > >>
> > >> o que tem de errado nesse codigo??
> > >
> > > "==" é operador de comparação. O operador de atribuição deve ser "="
> > >
> > > Além disso, o "else" que você colocou não tem nenhuma utilidade, e eu
> > > recomendaria fortemente retirá-lo. O resultado seria
> > >
> > >>>> if data== None:
> > >>>> data = '2008-01-01'
> >
> > Ou melhor ainda:
> > |
> > |if data is None:
> > |....data = '2008-01-01'
> > |
> >
> > Ou ainda:
> > |
> > |if not data:
> > |....data = '2008-01-01'
> > |
> > >
> > >>
> > >> ------------------------------------
> > >>
> > >> ,----------------------------------------------------------.
> > >> | Antes de enviar um e-mail para o grupo leia: |
> > >> | http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar |
> > >> | E se você é usuário do BOL lembre-se de cadastrar o |
> > >> | e-mail do grupo na lista branca do seu sistema anti-spam. |
> > >> `----------------------------------------------------------´Links do
> > >> Yahoo! Grupos
> > >>
> > >>
> > >>
> > >
> > > --
> > > Adam Victor Nazareth Brandizzi
> > > http://brandizzi.googlepages.com/
> > >
> >
> > --
> > Rodolfo Carvalho
> > Web Developer
> > [hidden email] <rodolfo.ueg%40gmail.com> <rodolfo.ueg%40gmail.com
> >
> >
> >
>
> --
> Iuri Diniz
> http://iuridiniz.com [Sou um agitador, não um advogado]
> http://blog.igdium.com [Linux on Limbo]
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]

Reply | Threaded
Open this post in threaded view
|

Re: variáveis

Luciano Ramalho
2009/1/10 Hugo Lopes <[hidden email]>:
> Esse if/else inline é meio perigoso quanto à versões do Python...

Sim, para quem está chegando agora vale notar que expressões do tipo
(a if b else c) só funcionam no Python 2.5 ou mai recente.

> Tem uma maneira mais elegante ainda do que esse if/else inline pra esse
> caso:
>  data = row['data'] or '2008-01-01'
> simples, não!?
> (não li a thread inteira, posso ter cometido algum engano quanto ao intuito
> original, mas essa mensagem é baseada apenas no codigo da mensagem acima)

Eu li a thread interia e a sua foi a melhor sugestão, Hugo.

> PS.: esses and/or podem parecer confusos quando não se trata apenas de
> logica booleana, mas quando voce entende como funciona, fica simples. Tem um
> amigo (Gustavo Rezende) que diz que nunca usaria um codigo do tipo, por
> legibilidade:
>  variavel = expressao and valor1 or valor2, que "simularia" um operador
> ternário
>
> Fica a critério, são "hacks" :-)

Eu acho que usar um or como na sua sugestão é bem legível e tranquilo,
não chega a ser um hack feio.

Agora, o uso de and e or como você mostrou é realmente pouco legível e
ainda perigoso. Veja porque:

>>> a = 1
>>> b = 2
>>> c = 3
>>> a and b or c
2
>>> a = 0
>>> a and b or c
3

Até aqui, tudo bem. A idéia de "a and b or c" é simular o operador
ternário da linguagem C: "a ? b : c", ou seja, se a é verdadeiro, a
expressão tem o valor de b, senão tem o valor de c. Porém, veja isso:

>>> a = 1
>>> b = 0
>>> a and b or c
3
>>>

Aqui a coisa quebrou, porque com o valor de a verdadeiro, o resultado
deveria ser o valor de b!!! Mas como o valor de b é falso, Python
retorna o valor de c, porque é assim que funciona o or.

Então a fórmula "a and b or c" só deve ser usada se você tiver
absoluta certeza que b nunca será um valor considerado falso...

Eu prefiro não usar este truque por este motivo.

[ ]s
Luciano
Reply | Threaded
Open this post in threaded view
|

Re: variáveis

Hugo Lopes Tavares
2009/1/10 Luciano Ramalho <[hidden email]>

> Até aqui, tudo bem. A idéia de "a and b or c" é simular o operador
> ternário da linguagem C: "a ? b : c", ou seja, se a é verdadeiro, a
> expressão tem o valor de b, senão tem o valor de c. Porém, veja isso:
>
> >>> a = 1
> >>> b = 0
> >>> a and b or c
> 3
> >>>
>
> Aqui a coisa quebrou, porque com o valor de a verdadeiro, o resultado
> deveria ser o valor de b!!! Mas como o valor de b é falso, Python
> retorna o valor de c, porque é assim que funciona o or.

Boa observação, vejo que eu realmente não tinha entendido como
funciona a expressão.
Qual a explicação disso, Luciano?
Reply | Threaded
Open this post in threaded view
|

Re: variáveis

Leonardo Santagada

On Jan 11, 2009, at 5:20 PM, Hugo Lopes wrote:

> 2009/1/10 Luciano Ramalho <[hidden email]>
>> Até aqui, tudo bem. A idéia de "a and b or c" é simular o operador
>> ternário da linguagem C: "a ? b : c", ou seja, se a é verdadeiro, a
>> expressão tem o valor de b, senão tem o valor de c. Porém, veja isso:
>>
>>>>> a = 1
>>>>> b = 0
>>>>> a and b or c
>> 3
>>>>>
>>
>> Aqui a coisa quebrou, porque com o valor de a verdadeiro, o resultado
>> deveria ser o valor de b!!! Mas como o valor de b é falso, Python
>> retorna o valor de c, porque é assim que funciona o or.
>
> Boa observação, vejo que eu realmente não tinha entendido como
> funciona a expressão.
> Qual a explicação disso, Luciano?


Nada em especial, é só o efeito da lógica booleana e do short-circuit  
dos operadores booleanos em Python (os operadores booleanos em C/C++ e  
Javascript tb são implementados com short-circuit, e imagino que isso  
vale pra maioria das linguagens de programação)

--
Leonardo Santagada
santagada at gmail.com



Reply | Threaded
Open this post in threaded view
|

Re: variáveis

Luciano Ramalho
In reply to this post by Hugo Lopes Tavares
2009/1/11 Hugo Lopes <[hidden email]>:

> 2009/1/10 Luciano Ramalho <[hidden email]>
>> Até aqui, tudo bem. A idéia de "a and b or c" é simular o operador
>> ternário da linguagem C: "a ? b : c", ou seja, se a é verdadeiro, a
>> expressão tem o valor de b, senão tem o valor de c. Porém, veja isso:
>>
>> >>> a = 1
>> >>> b = 0
>> >>> a and b or c
>> 3
>> >>>
>>
>> Aqui a coisa quebrou, porque com o valor de a verdadeiro, o resultado
>> deveria ser o valor de b!!! Mas como o valor de b é falso, Python
>> retorna o valor de c, porque é assim que funciona o or.
>
> Boa observação, vejo que eu realmente não tinha entendido como
> funciona a expressão.
> Qual a explicação disso, Luciano?

Para começar, é preciso ter em mente que a função primordial dos
operadores and e or é avaliar expressões booleanas.

Ao avaliar expressões booleanas, Python usa "avaliação curto-circuito", ou seja:

- no operador and, se o primeiro operando é falso, a expressão é
certamente falsa e o segundo operando não é avaliado

- no operador or, se o primeiro operando é verdadeiro, a expressão é
certamente verdadeira e o segundo operando não é avaliado

Isso significa inclusive que se o segundo operando tem uma chamada de
função, a função não será invocada, veja só:

>>> def ping():
...   print 'ping!'
...   return True
...
>>> a = True
>>> a and ping()
ping!
True
>>> a or ping()
True
>>>

Mas a linguagem Python permite que a gente use qualquer valor num
contexto booleano (num if ou while, por exemplo), e não apenas os
valores da classe bool que são True e False.

Entre os tipos embutidos na linguagem, qualquer valor numérico zero,
qualquer coleção vazia e o valor None são considerados falsos; e
qualquer outra coisa é considerada verdadeira.

Então, no espírito desta convenção, o Guido fez uma coisa muito
esperta: os operadores and e or não produzem um resultado bool, eles
produzem o valor do objeto que define o valor booleano da expressão,
em outras palavras, o último valor avaliado no processamento da
expressão pelo método do curto-circuito.

Esse comportamento é 100% compatível com o uso do and e or em
expressões booleanas, mas também permite que eles sejam usados para
processar outros tipos de valores.

>>> a = 1
>>> b = 2
>>> z = 0
>>> a and b
2
>>> a and z
0
>>> a or b
1
>>> a or z
1

Um bom exemplo prático é o método __str__ do código abaixo:

>>> class Cao:
...   def __init__(self, nome=None):
...     self.nome = nome
...   def __str__(self):
...     return self.nome or ('cao #x%x'%id(self))
...
>>> r = Cao('Rex')
>>> print r
Rex
>>> c = Cao()
>>> print c
cao #x7f7573762248
>>>

Ou seja, se o cão tem um nome não-nulo e não-vazio, __str__ devolve o
nome do cão, do contrário, devolve uma uma string que identifica o cão
pelo id do objeto.

A gente usa muito este tipo de coisa ao programar views em Django.

Para quem curte orientação a objetos, o funcionamento do and e or
demonstra o uso intensivo de polimorfismo na linguagem Python. Ao
criar uma classe, você pode definir como é o valor booleano de uma
instância implementando um método especial chamado __nonzero__, e pode
até fazer os operadores and e or funcionarem do seu jeito,
implementando __and__ e __or__.

[ ]s
Luciano

PS. O operador not, por outro lado, é mais conservador e sempre gera
um resultado bool:

>>> not True
False
>>> not False
True
>>> a = 1
>>> z = 0
>>> not a
False
>>> not z
True
>>>

Aliás, nem poderia ser diferente. Em Basic eu lembro que uma pegadinha
é que o not fazia um not bit-a-bit, ou seja, (not 0) é -1 e (not -1) é
0, mas (not 1) é -2 ou algum outro número diferente de zero, o que
provoca bugs chatos.