Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Where is NoneType in Python 3? #63637

Closed
mpb mannequin opened this issue Oct 29, 2013 · 10 comments
Closed

Where is NoneType in Python 3? #63637

mpb mannequin opened this issue Oct 29, 2013 · 10 comments
Labels
docs Documentation in the Doc dir

Comments

@mpb
Copy link
Mannequin

mpb mannequin commented Oct 29, 2013

BPO 19438
Nosy @rhettinger, @bitdancer, @andresdelfino
PRs
  • [doc] Improve NoneType/NotImplementedType/ellipsis documentation #22161
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = <Date 2020-10-21.18:40:05.285>
    created_at = <Date 2013-10-29.20:31:31.328>
    labels = ['docs']
    title = 'Where is NoneType in Python 3?'
    updated_at = <Date 2020-10-21.18:40:05.285>
    user = 'https://bugs.python.org/mpb'

    bugs.python.org fields:

    activity = <Date 2020-10-21.18:40:05.285>
    actor = 'adelfino'
    assignee = 'docs@python'
    closed = True
    closed_date = <Date 2020-10-21.18:40:05.285>
    closer = 'adelfino'
    components = ['Documentation']
    creation = <Date 2013-10-29.20:31:31.328>
    creator = 'mpb'
    dependencies = []
    files = []
    hgrepos = []
    issue_num = 19438
    keywords = ['patch']
    message_count = 10.0
    messages = ['201666', '201667', '201670', '201684', '201702', '376613', '376614', '376620', '376667', '379228']
    nosy_count = 5.0
    nosy_names = ['rhettinger', 'r.david.murray', 'docs@python', 'mpb', 'adelfino']
    pr_nums = ['22161']
    priority = 'low'
    resolution = 'fixed'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = None
    url = 'https://bugs.python.org/issue19438'
    versions = ['Python 3.3', 'Python 3.4']

    @mpb
    Copy link
    Mannequin Author

    mpb mannequin commented Oct 29, 2013

    types.NoneType seems to have disappeared in Python 3. This is probably intentional, but I cannot figure out how to test if a variable is of type NoneType in Python 3.

    Specifically, I want to write:
    assert type (v) in ( bytes, types.NoneType )

    Yes, I could write:
    assert v is None or type (v) is bytes

    But the first assert statement is easier to read (IMO).

    Here are links to various Python 3 documentation about None:

    [1] http://docs.python.org/3/library/stdtypes.html#index-2

    [2] http://docs.python.org/3/library/constants.html#None

    Link [2] says: "None The sole value of the type NoneType." However, NoneType is not listed in the Python 3 documentation index. (As compared with the Python 2 index, where NoneType is listed.)

    [3] http://docs.python.org/3/library/types.html

    If NoneType is gone in Python 3, mention of NoneType should probably be removed from link [2]. If NoneType is present in Python 3, the docs (presumably at least one of the above links, and hopefully also the index) should tell me how to use it.

    Here is another link:

    [4] http://docs.python.org/3/library/stdtypes.html#bltin-type-objects

    "The standard module types defines names for all standard built-in types." (Except <class 'NoneType'> ???)

    None is a built-in constant. It has a type. If None's type is not considered to be a "standard built-in type", then IMO this is surprising(!!) and should be documented somewhere (for example, at link [4], and possibly elsewhere as well.)

    Thanks!

    @mpb mpb mannequin assigned docspython Oct 29, 2013
    @mpb mpb mannequin added the docs Documentation in the Doc dir label Oct 29, 2013
    @tiran
    Copy link
    Member

    tiran commented Oct 29, 2013

    How about:

    type(v) in (bytes, type(None))
    

    or:

       isinstance(v, (bytes, type(None))

    or:

    v is None or type(v) is bytes

    or:

    v is None or isinstance(v, bytes)

    @mpb
    Copy link
    Mannequin Author

    mpb mannequin commented Oct 29, 2013

    Of your 4 suggestions, I mentioned #3 and #4 in my post. They are less readable, IMO.

    1 and 2 are nicer, but both have an "extra" set of nested parenthesis.

    While I appreciate the suggestions, I submitted this as a documentation bug, because I think I should be able to find these suggestions somewhere in the Python 3 documentation, at one (or more) of the links I included in my bug report. Also, the Python 3 documentation does mention NoneType, and if NoneType is not part of Python 3, I claim this is an error in the documentation.

    And then, there is my personal favorite work-around:

    NoneType = type (None)    # only needed once
    assert type (v) in ( bytes, NoneType )

    Or (perhaps more confusingly, LOL!):

    none = type (None)
    assert type (v) in ( bytes, none )

    isinstance is more confusing because it takes two arguments. Whenever I use it I have to think, "isinstance" vs "instanceof", which is Python, which is Java? (And I haven't used Java seriously in years!) And then I have to think about the order of the arguments (v, cls) vs (cls, v). type is just simpler than isinstance.

    @bitdancer
    Copy link
    Member

    See http://www.python.org/dev/peps/pep-0294/ for some background on this. The unexpected thing is actually that the types module still exists at all in Python3 :)

    That said, its documentation could, indeed, use some improvement to address this kind of question.

    Searching the python-dev email list for 'NoneType removal types module" turns up some interesting posts, back in the 2.3 days...basically, type(None) is the One True Way to get NoneType :)

    @mpb
    Copy link
    Mannequin Author

    mpb mannequin commented Oct 30, 2013

    Regarding http://www.python.org/dev/peps/pep-0294/ ...

    Complete removal of the types module makes more sense to me than letting types continue, but removing NoneType from it!

    If type(None) is the one_true_way, then the docs should say that, possibly in multiple locations.

    @rhettinger
    Copy link
    Contributor

    I would support adding NoneType back to the types module. Am not sure why it was ever removed. It has a much reason to exists as types.FunctionType which is a clear, well-named short-cut for "type(lambda :None)".

    @andresdelfino
    Copy link
    Contributor

    types.NoneType was removed here: c9543e4#diff-0f021aec4e35b86a3160d44069dec997

    The thing of adding NoneType to types that is somewhat unpleasing to me is that it's named exactly as the actual type. Seems confusing.

    @rhettinger
    Copy link
    Contributor

    Thanks for the link. It looks like NoneType got inadvertently caught up in the sweep of names that had direct synonyms.

    @andresdelfino
    Copy link
    Contributor

    ammar2 found this mail mentioning the changes in that commit https://mail.python.org/pipermail/python-dev/2007-November/075386.html

    "I've removed the 'new' module from py3k and also removed a lot of types
    from the 'types' module in py3k. It only contains types that aren't
    easily available through builtins."

    @andresdelfino
    Copy link
    Contributor

    As per #22336 I believe this issue can be closed now.

    My PR is not relevant to the problem stated by OP, so I'm "unlinking" it.

    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    docs Documentation in the Doc dir
    Projects
    None yet
    Development

    No branches or pull requests

    4 participants