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 { str, NoneType }

But where is NoneType located in Python?

Without any import, using NoneType produces NameError: name 'NoneType' is not defined.

有帮助吗?

解决方案 2

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.

其他提示

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 in Python versions older than 3.10*.

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

* As of Python 3.10, you could use types.NoneType, to be consistent with the other singleton types being added to the types module.

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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top