'Where is the NoneType located in Python 3.x?
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
.
Solution 1:[1]
types.NoneType
is being reintroduced in Python 3.10.
Improved Modules
Reintroduced the
types.EllipsisType
,types.NoneType
andtypes.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.
Solution 2:[2]
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.
Solution 3:[3]
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)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | |
Solution 3 | sam |