Python 2.4 removes None data type?

Discussion in 'Python' started by gaudetteje@gmail.com, Mar 4, 2005.

  1. Guest

    I just read in the 'What's New in Python 2.4' document that the None
    data type was converted to a constant:
    http://python.org/doc/2.4/whatsnew/node15.html

    """
    # None is now a constant; code that binds a new value to the name
    "None" is now a syntax error.
    """

    So, what's the implications of this? I find the lack of explanation a
    little puzzling, since I've written code that compares a variable's
    type with the 'None' type. For example, a variable would be
    initialized to 'None' and if it went through a loop unchanged, I could
    determine this at the end by using a conditional type(var) ==
    type(None). What will type(None) return now?
     
    , Mar 4, 2005
    #1
    1. Advertising

  2. Tim Peters Guest

    []
    > I just read in the 'What's New in Python 2.4' document that the None
    > data type was converted to a constant:
    > http://python.org/doc/2.4/whatsnew/node15.html
    >
    > """
    > # None is now a constant; code that binds a new value to the name
    > "None" is now a syntax error.
    > """
    >
    > So, what's the implications of this?


    No implications, for any sane code. You can no longer do things like this:

    >>> None = 2

    SyntaxError: assignment to None

    That's all.

    > I find the lack of explanation a little puzzling, since I've written code that
    > compares a variable's type with the 'None' type. For example, a variable
    > would be initialized to 'None' and if it went through a loop unchanged, I could
    > determine this at the end by using a conditional type(var) == type(None).


    Python's None is a singleton, meaning that there is a single, unique
    instance of type type(None). So in the case you describe, it's
    correct, and idiomatic, to test

    if var is None:

    instead. Checking type(var) against type(None) will still work, but
    was never the best way to do it.

    If you have an expression like

    var = None

    that's fine. You're not changing the binding of name "None" there,
    you're changing the binding of name "var".

    > What will type(None) return now?


    That hasn't changed:

    >>> type(None)

    <type 'NoneType'>
     
    Tim Peters, Mar 4, 2005
    #2
    1. Advertising

  3. In article <>,
    <> wrote:
    >
    >
    >I just read in the 'What's New in Python 2.4' document that the None
    >data type was converted to a constant:
    >http://python.org/doc/2.4/whatsnew/node15.html
    >
    >"""
    ># None is now a constant; code that binds a new value to the name
    >"None" is now a syntax error.
    >"""
    >
    >So, what's the implications of this? I find the lack of explanation a
    >little puzzling, since I've written code that compares a variable's
    >type with the 'None' type. For example, a variable would be
    >initialized to 'None' and if it went through a loop unchanged, I could
    >determine this at the end by using a conditional type(var) ==
    >type(None). What will type(None) return now?


    Empirically, NoneType, same as before. The change you refer to is
    to prevent the user from doing silly things like:

    ==========================================================================
    Python 2.3.4 (#1, Feb 8 2005, 13:07:40)
    [GCC 3.3.3 (NetBSD nb3 20040520)] on netbsd2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> type(None)

    <type 'NoneType'>
    >>> None="fred"

    <stdin>:1: SyntaxWarning: assignment to None
    >>> None

    'fred'
    >>> type(None)

    <type 'str'>
    >>>

    ==========================================================================
    Python 2.4 (#1, Mar 4 2005, 16:55:16)
    [GCC 3.3.3 (NetBSD nb3 20040520)] on netbsd2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> type(None)

    <type 'NoneType'>
    >>> None="Fred"

    SyntaxError: assignment to None
    >>> type(None)

    <type 'NoneType'>
    >>>

    ==========================================================================

    So your idiom should still work. Note that since there is only
    one NoneType instance (i.e. None), you can just test for "var is None"
    and save yourself some work.

    Gary Duzan
    BBN Technologies
     
    Gary D. Duzan, Mar 4, 2005
    #3
  4. wrote:

    > I just read in the 'What's New in Python 2.4' document that the None
    > data type was converted to a constant:
    > http://python.org/doc/2.4/whatsnew/node15.html


    Implication: A long standing wart in Python now gone. Its time to
    gloat. Are there any really evil glitches LEFT in Python? Now go look at
    Perl and come back and say "Thank-deity-of-my-choice-I'm-using-Python".


    Warren
     
    Warren Postma, Mar 4, 2005
    #4
  5. Steve Holden Guest

    Warren Postma wrote:
    > wrote:
    >
    >> I just read in the 'What's New in Python 2.4' document that the None
    >> data type was converted to a constant:
    >> http://python.org/doc/2.4/whatsnew/node15.html

    >
    >
    > Implication: A long standing wart in Python now gone. Its time to
    > gloat. Are there any really evil glitches LEFT in Python? Now go look at
    > Perl and come back and say "Thank-deity-of-my-choice-I'm-using-Python".
    >
    >

    Remaining warts that won't disappear:

    print >> file, stuff
    @decorator

    regards
    Steve
    --
    Meet the Python developers and your c.l.py favorites March 23-25
    Come to PyCon DC 2005 http://www.pycon.org/
    Steve Holden http://www.holdenweb.com/
     
    Steve Holden, Mar 4, 2005
    #5
  6. Warren Postma wrote:

    > Implication: A long standing wart in Python now gone. Its time to
    > gloat. Are there any really evil glitches LEFT in Python? Now go look at
    > Perl and come back and say "Thank-deity-of-my-choice-I'm-using-Python".


    The fact that True and False are not constants?
    --
    Michael Hoffman
     
    Michael Hoffman, Mar 4, 2005
    #6
  7. Roy Smith Guest

    In article <>,
    "" <> wrote:

    > I just read in the 'What's New in Python 2.4' document that the None
    > data type was converted to a constant:
    > http://python.org/doc/2.4/whatsnew/node15.html
    >
    > """
    > # None is now a constant; code that binds a new value to the name
    > "None" is now a syntax error.
    > """
    >
    > So, what's the implications of this? I find the lack of explanation a
    > little puzzling, since I've written code that compares a variable's
    > type with the 'None' type. For example, a variable would be
    > initialized to 'None' and if it went through a loop unchanged, I could
    > determine this at the end by using a conditional type(var) ==
    > type(None). What will type(None) return now?


    Just out of curiosity, *why* did you test against type(None). What did it
    buy you compared to the simpler var == None'?

    In any case, it looks like it does the right thing:

    Python 2.4 (#1, Jan 17 2005, 14:59:14)
    [GCC 3.3.3 (NetBSD nb3 20040520)] on netbsd2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> type (None)

    <type 'NoneType'>
     
    Roy Smith, Mar 4, 2005
    #7
  8. John Machin Guest

    wrote:
    > I just read in the 'What's New in Python 2.4' document that the None
    > data type was converted to a constant:
    > http://python.org/doc/2.4/whatsnew/node15.html
    >
    > """
    > # None is now a constant; code that binds a new value to the name
    > "None" is now a syntax error.
    > """
    >
    > So, what's the implications of this?


    Relax. The sky is not falling.

    > I find the lack of explanation a
    > little puzzling, since I've written code that compares a variable's
    > type with the 'None' type.


    It is saying that if you had been silly enough to do

    None = "fubar"

    you will now get a syntax error.

    It said absolutely nothing about "removes None data type".

    There are (at least) two possible reasons for a lack of explanation:

    (1) Python is one of those expensive software products that hit you
    with "upgrades" where you have difficulty finding about the changes in
    advance (let alone participarting in the design process) and require
    you to recode large chunks of your application but you can't find out
    with any sort of precision the necessary changes might be from the
    vague descriptions on a complex and ever-changing website.

    (2) Unless you have done something completely idiotic [which the change
    is designed to prevent], no change is required to your code. OR, like
    for the changes to integer division, the change is announced for a
    future version, you can do "from __future__ inport whatever". Any
    furore (and there have been some doozies) noticeable in the newsgroup
    is part of the design process, and has died down well before the
    changes are released.

    Which do you think is more likely?

    > For example, a variable would be
    > initialized to 'None' and if it went through a loop unchanged, I

    could
    > determine this at the end by using a conditional type(var) ==
    > type(None).


    or by var == None or var is None

    > What will type(None) return now?


    Constants have types. What made you think that its type would change?
     
    John Machin, Mar 5, 2005
    #8
  9. John J. Lee Guest

    Steve Holden <> writes:
    > Warren Postma wrote:

    [...]
    > > gloat. Are there any really evil glitches LEFT in Python? Now go
    > > look at Perl and come back and say
    > > "Thank-deity-of-my-choice-I'm-using-Python".
    > >

    > Remaining warts that won't disappear:
    >
    > print >> file, stuff


    Not beautiful, yes, but evil? Why?


    > @decorator


    Evil in the wrong hands...


    John
     
    John J. Lee, Mar 5, 2005
    #9
  10. Guest

    Sheesh... I didn't actually pull the type(None) comparison out of my
    code. I was simply throwing together a possible situation. Had I
    thought about it for more than a second I would have remembered how I
    would actually use it.

    Thanks for clearing up the confusion. I wasn't previously aware that
    you could assign anything to None. Glad it's been changed, because
    this would be the kind of thing to spawn evil code.
     
    , Mar 5, 2005
    #10
  11. Michael Hoffman wrote:
    > The fact that True and False are not constants?


    Yowza.

    a = True
    b = False
    False = a
    True = b
    if (1==2)==True:
    print "Doom"
     
    Warren Postma, Mar 7, 2005
    #11
  12. Michael Hoffman wrote:
    > The fact that True and False are not constants?


    Yowza.

    a = True
    b = False
    False = a
    True = b
    if (1==2)==True:
    print "Doom"
     
    Warren Postma, Mar 7, 2005
    #12
  13. Warren Postma wrote:
    > Michael Hoffman wrote:
    >
    >> The fact that True and False are not constants?

    >
    > Yowza.
    >
    > a = True
    > b = False
    > False = a
    > True = b
    > if (1==2)==True:
    > print "Doom"


    Why stop there when you can really cause some doom:

    py> import __builtin__ as bltin
    py> bltin.True, bltin.False = bltin.False, bltin.True

    As an example of what doom this causes, try typing it at the interactive
    prompt, and then see if you can enter anything else. I can't -- the
    prompt just locks up. Woo-hoo! Another way to shoot myself (and my
    users) in the foot! =)

    STeVe
     
    Steven Bethard, Mar 7, 2005
    #13
  14. Steven Bethard said unto the world upon 2005-03-07 11:55:
    > Warren Postma wrote:
    >
    >> Michael Hoffman wrote:
    >>
    >>> The fact that True and False are not constants?

    >>
    >>
    >> Yowza.
    >>
    >> a = True
    >> b = False
    >> False = a
    >> True = b
    >> if (1==2)==True:
    >> print "Doom"

    >
    >
    > Why stop there when you can really cause some doom:
    >
    > py> import __builtin__ as bltin
    > py> bltin.True, bltin.False = bltin.False, bltin.True
    >
    > As an example of what doom this causes, try typing it at the interactive
    > prompt, and then see if you can enter anything else. I can't -- the
    > prompt just locks up. Woo-hoo! Another way to shoot myself (and my
    > users) in the foot! =)
    >
    > STeVe


    Hi all,

    just tried this in IDLE:

    IDLE 1.1
    >>> import __builtin__ as bltin
    >>> bltin.True, bltin.False = bltin.False, bltin.True


    >>> ================================ RESTART

    ================================

    The restart was done by IDLE itself -- poor thing just gave up. So, it
    looks like Steve has found a `commit suicide' command for an IDLE
    shell :)

    Best to all,

    Brian vdB
     
    Brian van den Broek, Mar 7, 2005
    #14
  15. John Machin Guest

    wrote:
    > Sheesh... I didn't actually pull the type(None) comparison out of my
    > code.


    Sheesh yourself. Newsgroup readers can't do inspect.hasaclue('J. Random
    Poster'); they rely on duck-typing or goose-typing.

    > I was simply throwing together a possible situation. Had I
    > thought about it for more than a second I would have remembered how I
    > would actually use it.


    Indeed.
     
    John Machin, Mar 7, 2005
    #15
  16. Warren Postma <wp@tekran__NOSP7M.com> writes:

    > wrote:
    >
    > > I just read in the 'What's New in Python 2.4' document that the None
    > > data type was converted to a constant:
    > > http://python.org/doc/2.4/whatsnew/node15.html

    >
    > Implication: A long standing wart in Python now gone. Its time to
    > gloat. Are there any really evil glitches LEFT in Python?


    Python 2.4 (#1, Dec 1 2004, 14:23:15)
    [GCC 3.2.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> True, False = False, True
    >>> True

    False
    >>>
     
    Jacek Generowicz, Mar 9, 2005
    #16
  17. Jarek Zgoda Guest

    Jacek Generowicz napisa³(a):

    >>Implication: A long standing wart in Python now gone. Its time to
    >>gloat. Are there any really evil glitches LEFT in Python?

    >
    > Python 2.4 (#1, Dec 1 2004, 14:23:15)
    > [GCC 3.2.3] on linux2
    > Type "help", "copyright", "credits" or "license" for more information.
    >
    >>>>True, False = False, True
    >>>>True

    >
    > False


    Ugh, today I've found this in some legacy code (yes, there *is* legacy
    code in Python). And I will not touch this module until such syntax
    become illegal.

    --
    Jarek Zgoda
    http://jpa.berlios.de/ | http://www.zgodowie.org/
     
    Jarek Zgoda, Mar 9, 2005
    #17
    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. David Freeman
    Replies:
    8
    Views:
    7,671
    tcena9
    Feb 16, 2011
  2. length power
    Replies:
    2
    Views:
    103
    Rustom Mody
    Apr 10, 2014
  3. Skip Montanaro
    Replies:
    0
    Views:
    70
    Skip Montanaro
    Apr 10, 2014
  4. Johannes Schneider

    Re: why i have the output of [None, None, None]

    Johannes Schneider, Apr 10, 2014, in forum: Python
    Replies:
    0
    Views:
    61
    Johannes Schneider
    Apr 10, 2014
  5. Terry Reedy
    Replies:
    0
    Views:
    67
    Terry Reedy
    Apr 10, 2014
Loading...

Share This Page