Where is the NoneType located in Python 3.x?

前端 未结 3 1632
孤城傲影
孤城傲影 2020-12-17 08:32

In Python 3, I would like to check whether value is either string or None.

One way to do this is

assert type(value) in { st         


        
相关标签:
3条回答
  • 2020-12-17 09:00

    types.NoneType is being reintroduced in Python 3.10.

    What’s New In Python 3.10

    Improved Modules

    types

    Reintroduced the types.EllipsisType, types.NoneType and types.NotImplementedType classes, providing a new set of types readily interpretable by type checkers. (Contributed by Bas van Beek in bpo-41810.)

    The discussion about the change was motivated by a need for types.EllipsisType, leading to types.NoneType also being added for consistency.

    0 讨论(0)
  • 2020-12-17 09:01

    You can use type(None) to get the type object, but you want to use isinstance() here, not type() in {...}:

    assert isinstance(value, (str, type(None)))
    

    The NoneType object is not otherwise exposed anywhere.

    I'd not use type checking for that at all really, I'd use:

    assert value is None or isinstance(value, str)
    

    as None is a singleton (very much on purpose) and NoneType explicitly forbids subclassing anyway:

    >>> type(None)() is None
    True
    >>> class NoneSubclass(type(None)):
    ...     pass
    ... 
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: type 'NoneType' is not an acceptable base type
    
    0 讨论(0)
  • 2020-12-17 09:05

    Please use type(None). You can use python shell to check like in the below function in which I use type(None) in order to change from None to NoneType.

    def to_unicode(value):
    '''change value to unicode'''
    try:
        if isinstance(value, (str,type(None))):
            return value
        if not isinstance(value, bytes):
            raise TypeError("Expected bytes, unicode, or None; got %r" % type(value))
        return value.decode("utf-8")
    except UnicodeDecodeError:
        return repr(value)
    
    0 讨论(0)
提交回复
热议问题