2
respostas

Definindo o "__lt__" funciona a comparação com "<" e com ">". Mas, como? Há casos que não deveria funcionar.

Introdução:

Defini uma classe com o "__lt__" com o seguinte retorno:

return self._saldo < outro._saldo

criei 3 contas, cujos "prints" retornam isso

[>>conta 1 Saldo 666<<]
[>>conta 2 Saldo 111<<]
[>>conta 3 Saldo 444<<]

Fazendo isso:

print(a2 < a3)
print(a2 > a3)

Recebo isso:

True
False

A comparação com "<" devolveu corretamente

True

E, se o ">" é implementado como o inverso do reultado do "<", então o retorno

False

além de ser o correto , era o esperado.

PORÉM...

Problema:

Fazendo

a2.deposita(333)

eu igualo os saldos das contas a2 e a3.

Então, fazendo

print(a2 < a3)

eu recebo o resultado

False

OK!

E, repetindo o que coloquei acima, se o ">" é implementado como o inverso do resultado do "<", então o retorno esperado de

print(a2 > a3)

seria

True

Só que não é!!!

O resultado de

print(a2 > a3)

é

False

que é o resultado correto (matematicamente), porém, NÃO é o esperado, como colocado acima.

Como assim?

Qual é a explicação???

Códigos para testes

A classe é

class ContaSalario:

  def __init__(self, codigo):
    self._codigo = codigo
    self._saldo = 0

  def __lt__(self, outro):
    return self._saldo < outro._saldo

  def deposita(self, valor):
    self._saldo += valor

  def __str__(self):
    return "[>>conta {} Saldo {}<<]".format(self._codigo, self._saldo)

e as contas foram criadas assim

a1 = ContaSalario(1)
a1.deposita(666)
a2 = ContaSalario(2)
a2.deposita(111)
a3 = ContaSalario(3)
a3.deposita(444)

os prints iniciais foram feitos assim

print(a1)
print(a2)
print(a3)
2 respostas

Olá Anselmo, toda a sua observação está correta, exceto quando diz:

"E, repetindo o que coloquei acima, se o ">" é implementado como o inverso do resultado do "<", então o retorno esperado de

print(a2 > a3)

seria True ..."

sendo ">" o inverso de "<" o comportamento esperado é realmente False pois o a2 = a3, logo ele não é ">" informado na comparação. Lembrando, a comparação feita é inversa e não o resultado.

Espero ter ajudado!

Entendida a lógica.

Realmente meu ponto de vista estava errado. (Eu não tinha duvida disso, só estava querendo saber qual seria o ponto de vista correto.)

Considerei que o Python avaliaria a funcionalidade inversa invertendo o resultado. Dãããh!

É claro que ele avalia a funcionalidade inversa invertendo a ordem dos valores operados.

Muito obrigado pelo esclarecimento, Eduardo!!!

(As vezes a gente trava em coisas tão simples... : ))) )