Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > int('2.1') does not work while int(float('2.1')) does

Reply
Thread Tools

int('2.1') does not work while int(float('2.1')) does

 
 
Vineet Jain
Guest
Posts: n/a
 
      04-06-2004
int('2.1') does not work while int(float('2.1')) does. If int can covert a
float object then there is no reason why a float string should not be
converted too.

When I do int('2.1') I get the following error:

>>> a = int('2.0')

Traceback (most recent call last):
File "<stdin>", line 1, in ?
ValueError: invalid literal for int(): 2.0

This does not seem very pythonic

VJ


 
Reply With Quote
 
 
 
 
Erik Max Francis
Guest
Posts: n/a
 
      04-06-2004
Vineet Jain wrote:

> int('2.1') does not work while int(float('2.1')) does. If int can
> covert a
> float object then there is no reason why a float string should not be
> converted too.
>
> When I do int('2.1') I get the following error:
>
> >>> a = int('2.0')

> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> ValueError: invalid literal for int(): 2.0
>
> This does not seem very pythonic


There's a fundamental difference between an int and a float. If the
string you're trying to convert looks like a float, that means it
doesn't look like an int.

With your first example of '2.1', what should it mean? Should it
truncate, round to negative infinity round to positive infinity, round
to zero, what? Python can't guess for you, so it shouldn't try. Thus
it's an error.

--
__ Erik Max Francis && http://www.velocityreviews.com/forums/(E-Mail Removed) && http://www.alcyone.com/max/
/ \ San Jose, CA, USA && 37 20 N 121 53 W && AIM erikmaxfrancis
\__/ If I had another face, do you think I'd wear this one?
-- Abraham Lincoln
 
Reply With Quote
 
 
 
 
Joe Mason
Guest
Posts: n/a
 
      04-06-2004
In article <(E-Mail Removed)>, Erik Max Francis wrote:
> There's a fundamental difference between an int and a float. If the
> string you're trying to convert looks like a float, that means it
> doesn't look like an int.
>
> With your first example of '2.1', what should it mean? Should it
> truncate, round to negative infinity round to positive infinity, round
> to zero, what? Python can't guess for you, so it shouldn't try. Thus
> it's an error.


Why can it make this guess for "int(2.1)", then? It's got a rule for
converting floats to ints - why not use it here?

Joe
 
Reply With Quote
 
Erik Max Francis
Guest
Posts: n/a
 
      04-06-2004
Joe Mason wrote:

> Why can it make this guess for "int(2.1)", then? It's got a rule for
> converting floats to ints - why not use it here?


Because int(aFloat) means round toward zero. int(aString) means make an
int out of this string.

--
__ Erik Max Francis && (E-Mail Removed) && http://www.alcyone.com/max/
/ \ San Jose, CA, USA && 37 20 N 121 53 W && AIM erikmaxfrancis
\__/ Convictions are more dangerous enemies of truth than lies.
-- Friedrich Nietzsche
 
Reply With Quote
 
Joe Mason
Guest
Posts: n/a
 
      04-06-2004
In article <(E-Mail Removed)>, Erik Max Francis wrote:
> Joe Mason wrote:
>
>> Why can it make this guess for "int(2.1)", then? It's got a rule for
>> converting floats to ints - why not use it here?

>
> Because int(aFloat) means round toward zero. int(aString) means make an
> int out of this string.


So why can't int(string) mean round toward zero?

Joe
 
Reply With Quote
 
Duncan Booth
Guest
Posts: n/a
 
      04-06-2004
Joe Mason <(E-Mail Removed)> wrote in
news:(E-Mail Removed):

> In article <(E-Mail Removed)>, Erik Max Francis wrote:
>> Joe Mason wrote:
>>
>>> Why can it make this guess for "int(2.1)", then? It's got a rule for
>>> converting floats to ints - why not use it here?

>>
>> Because int(aFloat) means round toward zero. int(aString) means make an
>> int out of this string.

>
> So why can't int(string) mean round toward zero?
>


If you want to round towards zero then you have an easy way to do it:

int(float(string))

If int(string) was changed to have this behaviour as well, then those of
who don't want any rounding wouldn't have any way to get the current
behaviour. Users may be surprised when they enter 2.1 and find the program
accepted it but didn't use the value they entered; I don't like suprising
users.

Or in more concise terms:

Explicit is better than implicit.

 
Reply With Quote
 
Mel Wilson
Guest
Posts: n/a
 
      04-06-2004
In article <(E-Mail Removed)>,
Joe Mason <(E-Mail Removed)> wrote:
>In article <(E-Mail Removed)>, Erik Max Francis wrote:
>> There's a fundamental difference between an int and a float. If the
>> string you're trying to convert looks like a float, that means it
>> doesn't look like an int.
>>
>> With your first example of '2.1', what should it mean? Should it
>> truncate, round to negative infinity round to positive infinity, round
>> to zero, what? Python can't guess for you, so it shouldn't try. Thus
>> it's an error.

>
>Why can it make this guess for "int(2.1)", then? It's got a rule for
>converting floats to ints - why not use it here?


I see it more as a programmer interface issue. There are
kinds of operation that can suggest (especially in a
dynamically-typed language) that your program has gotten
away from you. Python creator(s?) could have drawn this
particular line to this side or that, but in historical fact
they drew it here. Perhaps on the principle of one
conversion at a time, please.

You could argue that unit testing, the universal solvent,
would clean up this too.

Regards. Mel.
 
Reply With Quote
 
Stephen Horne
Guest
Posts: n/a
 
      04-06-2004
On 6 Apr 2004 11:52:32 GMT, Duncan Booth <(E-Mail Removed)> wrote:

>If int(string) was changed to have this behaviour as well, then those of
>who don't want any rounding wouldn't have any way to get the current
>behaviour. Users may be surprised when they enter 2.1 and find the program
>accepted it but didn't use the value they entered; I don't like suprising
>users.


Even this is debatable, as it is possible to spot the error.

>>> '.' in '2.1'

True

Or, to be sure about it...

>>> numstr = '2.1'
>>> ('.' in numstr) or ('E' in numstr.upper ())

True


You claim it's a case of "Explicit is better than implicit" but I
don't know any typecast that is explicit about what it is casting from
in any language, Python included.


One way or the other, some users get a slight extra hassle. In this
case I think Python got it right for two reasons...

1. Wanting to implicitly accept a float in a string as an integer is
relatively unusual, so better to have the small extra hassle in
this case.

2. Accidentally accepting a float in a string as an integer when you
shouldn't is a bad thing - it is usually better to get a highly
visible exception early in development rather than releasing a
program which gives bad results without warning.

But it wouldn't matter than much either way. I've used at least one
language that did the conversion in one step and that never created a
serious problem. As Mel Wilson said...

: You could argue that unit testing, the universal solvent,
: would clean up this too.



--
Steve Horne

steve at ninereeds dot fsnet dot co dot uk
 
Reply With Quote
 
Raymond Hettinger
Guest
Posts: n/a
 
      04-07-2004
My vote for QOTW:

> You could argue that unit testing, the universal solvent,
> would clean up this too.



Raymond
 
Reply With Quote
 
Fredrik Lundh
Guest
Posts: n/a
 
      04-16-2004
Joe Mason wrote:int out of this string.
>
> So why can't int(string) mean round toward zero?


because it isn't what it means.

why so obsessed with breaking existing code? don't you have
anything better to do with your life?

</F>




 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
How does annotation injection work, while maintaining security? Danno Java 2 03-23-2007 04:19 PM
Why does this return fail to work while the other doesn't? The Cool Giraffe C++ 6 02-14-2007 08:50 AM
MS work around on text wrapping in a datagrid does not work TB ASP .Net 2 02-22-2006 10:34 PM
Why does glob() work in while loop? J. Romano Perl Misc 1 01-27-2005 03:17 AM
Webservice works once and then DOES NOT seem to work even though program does not crash Phi! ASP .Net Web Services 1 04-23-2004 08:42 AM



Advertisments