I have a method that sometimes returns a NoneType value. So how can I question a variable that is a NoneType? I need to use if method, for example
if not new:
new = '#'
I know that is the wrong way and I hope you understand what I meant.
So how can I question a variable that is a NoneType?
Use is
operator, like this
if variable is None:
Why this works?
Since None
is the sole singleton object of NoneType
in Python, we can use is
operator to check if a variable has None
in it or not.
Quoting from is
docs,
The operators
is
andis not
test for object identity:x is y
is true if and only ifx
andy
are the same object.x is not y
yields the inverse truth value.
Since there can be only one instance of None
, is
would be the preferred way to check None
.
Hear it from the horse's mouth
Quoting Python's Coding Style Guidelines - PEP-008 (jointly defined by Guido himself),
Comparisons to singletons like
None
should always be done withis
oris not
, never the equality operators.
None
, they both will yield similar result.
Nov 8, 2019 at 9:47
pandas
DataFrame exists -- for that, I use type(df) is type(None)
to avoid: The truth value of a DataFrame is ambiguous
Mar 6, 2020 at 18:43
isinstance(instance, type(None))
should be added to make this a complete answer. There are edge cases. For example, if you are building a dynamic tuple of types for validation and the validator is using isinstance (which takes a tuple).
if variable is None:
...
if variable is not None:
...
It can also be done with isinstance
as per Alex Hall's answer :
>>> NoneType = type(None)
>>> x = None
>>> type(x) == NoneType
True
>>> isinstance(x, NoneType)
True
isinstance
is also intuitive but there is the complication that it requires the line
NoneType = type(None)
which isn't needed for types like int
and float
.
NoneType
and since None
is a singleton, isinstance
should not be used to detect None
- instead you should do as the accepted answer says, and use is None
or is not None
.
Dec 4, 2018 at 18:59
isinstance
(which takes a list).
assert isinstance(x, str) or x is None
will not result in x
being inferred as str | None
by Pyright, but assert isinstance(x, (str, type(None)))
will.
As pointed out by Aaron Hall's comment:
Since you can't subclass
NoneType
and sinceNone
is a singleton,isinstance
should not be used to detectNone
- instead you should do as the accepted answer says, and useis None
oris not None
.
Original Answer:
The simplest way however, without the extra line in addition to cardamom's answer is probably:
isinstance(x, type(None))
So how can I question a variable that is a NoneType? I need to use if method
Using isinstance()
does not require an is
within the if
-statement:
if isinstance(x, type(None)):
#do stuff
Additional information
You can also check for multiple types in one isinstance()
statement as mentioned in the documentation. Just write the types as a tuple.
isinstance(x, (type(None), bytes))
NoneType
and since None
is a singleton, isinstance
should not be used to detect None
- instead you should do as the accepted answer says, and use is None
or is not None
.
Dec 4, 2018 at 19:01
isinstance
should not be used ? I understand that is
should be preferred, but there are some cases where the isinstance form feels more natural (like checking for multiple types at once isinstance(x, (str, bool, int, type(None)))
). Is it just a personal preference or is there caveat that I'm unaware of ?
Sep 9, 2019 at 13:35
type
2. then calling it 3. then looking up the type of None
- when None
is both a singleton and a keyword. Another downside: 4. this is very non-standard and will raise eyebrows when people are looking at your code. x is None
is a more optimized check. I would suggest x is None or isinstance(x, (str, bool, int))
- but I would also suggest you think more about what you're doing when you're doing that kind of type checking for types that don't have a lot in common...
Sep 9, 2019 at 15:17
Not sure if this answers the question. But I know this took me a while to figure out. I was looping through a website and all of sudden the name of the authors weren't there anymore. So needed a check statement.
if type(author) == type(None):
print("my if body")
else:
print(" my else body")
Author can be any variable in this case, and None
can be any type that you are checking for.
None
is a singleton, type
should not be used to detect None
- instead you should do as the accepted answer says, and use is None
or is not None
.
Dec 4, 2018 at 19:02
Python 2.7 :
x = None
isinstance(x, type(None))
or
isinstance(None, type(None))
==> True
NoneType
and since None
is a singleton, isinstance
should not be used to detect None
- instead you should do as the accepted answer says, and use is None
or is not None
.
Dec 4, 2018 at 19:01
I hope this example will be helpful for you)
print(type(None)) # NoneType
So, you can check type of the variable name
# Example
name = 12 # name = None
if type(name) is type(None):
print("Can't find name")
else:
print(name)
None
is a singleton and None
is the only instance of NoneType
, your example is more complicated than necessary. Just check your variable for None
: if name is None: ...
I mostly use the following method to check for NoneType.
if (new): # not None
...
else: # NoneType
...
You can test explicitly for NoneType
by importing it:
>>> from types import NoneType
or, without import:
>>> NoneType = type(None)
When is this useful?
When you have a variable that's optional which can be either set to its type or to None
. Now you want to validate its type using a single isinstance
call:
>>> from types import NoneType
>>> foo = 'bar'
>>> assert isinstance(foo, (str, NoneType))
which is equivalent to:
>>> assert isinstance(foo, str) or isinstance(foo, NoneType)
as well as:
>>> assert isinstance(foo, str) or (foo is None)
None
is the only value your method returns for whichbool(returnValue)
equalsFalse
, thenif not new:
ought to work fine. This occurs sometimes in the built-in libs - for example,re.match
returns either None or a truthy match object.null
andNone
in python here.