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

Discussion in 'Python' started by Vineet Jain, Apr 6, 2004.

  1. Vineet Jain

    Vineet Jain Guest

    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
     
    Vineet Jain, Apr 6, 2004
    #1
    1. Advertising

  2. 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.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
     
    Erik Max Francis, Apr 6, 2004
    #2
    1. Advertising

  3. Vineet Jain

    Joe Mason Guest

    In article <>, 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
     
    Joe Mason, Apr 6, 2004
    #3
  4. 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 && && 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
     
    Erik Max Francis, Apr 6, 2004
    #4
  5. Vineet Jain

    Joe Mason Guest

    In article <>, 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
     
    Joe Mason, Apr 6, 2004
    #5
  6. Vineet Jain

    Duncan Booth Guest

    Joe Mason <> wrote in
    news::

    > In article <>, 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.
     
    Duncan Booth, Apr 6, 2004
    #6
  7. Vineet Jain

    Mel Wilson Guest

    In article <>,
    Joe Mason <> wrote:
    >In article <>, 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.
     
    Mel Wilson, Apr 6, 2004
    #7
  8. On 6 Apr 2004 11:52:32 GMT, Duncan Booth <> 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
     
    Stephen Horne, Apr 6, 2004
    #8
  9. My vote for QOTW:

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



    Raymond
     
    Raymond Hettinger, Apr 7, 2004
    #9
  10. 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>
     
    Fredrik Lundh, Apr 16, 2004
    #10
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Schnoffos
    Replies:
    2
    Views:
    1,223
    Martien Verbruggen
    Jun 27, 2003
  2. bd
    Replies:
    0
    Views:
    635
  3. Nick Coghlan
    Replies:
    0
    Views:
    485
    Nick Coghlan
    Dec 6, 2004
  4. k3n3dy
    Replies:
    15
    Views:
    997
    dan2online
    Apr 20, 2006
  5. Carsten Fuchs
    Replies:
    45
    Views:
    1,560
    James Kanze
    Oct 8, 2009
Loading...

Share This Page