[pyar] Int anti-intuitivo

Mariano Guerra luismarianoguerra en gmail.com
Lun Nov 15 08:44:10 ART 2010


2010/11/15 Sebastian Bassi <sbassi en clubdelarazon.org>:
> 2010/11/15 QliX=D! [aka EHB] <qlixed en gmail.com>
>>
>> Help on class int in module __builtin__:
>> [...]
>> No mucho mas que decir... no?
>
> Si, anti-intuitivo es justamente porque necesitas agarrarte del manual para
> justificarlos :)

aca va mi opinion de porque es asi, es solo una opinion, no lo justifica.

cuando haces el cast de un float a int haces la conversion de un paso
y sos explicito en que queres, le decis que queres un int de lo que
antes era un float.

cuando haces int de un string lo que le decis es "quiero la
representacion en numero de este string que contiene un entero", es
una conversion de un paso tambien.

si le pasas un string que tiene la representacion de un float ahi si
se comportara como vos decis pasa a violar el "explicit is better than
implicit", porque si vos lo que queres es castear a int solo strings
que son ints validos se te "meten" las representaciones de float y no
tenes forma de saber cual vino, si queres hacerlo explicito no
requiere mucho trabajo extra y queda claro que aceptas floats viniendo
del string.

>>> int(float("2.1"))
2

si fuera implicito tendrias casos en los que podrias perder
informacion implicitamente, ya que si vino un 2.1 me gustaria saberlo
y tomar la decision explicitamente.

por otra parte la linea siguiente:

>>> int(float("2"))
2

tiene sentido ya que 2 es otra forma de decir 2.0 y no se pierde informacion.

el problema que sucede cuando dejamos que el lenguaje decida que es
bueno para nosotros se ve reflejado en lenguajes como js y php en los
que por lo general las decisiones que toma el lenguaje nunca son las
que queremos e introducen un monton de bugs dificiles de encontrar,
por ejemplo:

http://php.net/manual/en/types.comparisons.php

y en javascript:

7 + 7 + 7; // = 21
7 + 7 + "7"; // = 147
"7" + 7 + 7; // = 777

1 == true; // = true
1 === true; // = false

7 == "7"; // = true
7 === "7"; // = false;

>>> 0 == "0"
true
>>> "0" == 0
true
>>> "1" == 1
true
>>> 1 == "1"
true
>>> "" == 0
true
>>> 0 == ""
true
>>> '' == '0'
false
>>> 0 == ''
true
>>> 0 == '0'
true
>>> false == '0'
true

en estos casos el lenguaje te quiere ayudar, pero tiene tantos
comportamientos implicitos que se convierte en algo no intuitivo,
prefiero ser explicito en cada caso y dormir mas tranquilo :P



More information about the pyar mailing list