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.
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
and is None
? –
Cloutman None
, they both will yield similar result. –
Gunsel pandas
DataFrame exists -- for that, I use type(df) is type(None)
to avoid: The truth value of a DataFrame is ambiguous
–
Traffic 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). –
Menu isinstance_or_none = lambda x, t: x is None or isinstance(x, t)
–
Chadwick if not variable:
? –
Dolan 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
. –
Celibacy isinstance
(which takes a list). –
Menu 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. –
Anacreontic 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
. –
Celibacy 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 ? –
Roister 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... –
Celibacy 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
. –
Celibacy my else body
?! –
Insociable 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
. –
Celibacy 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: ...
–
Porcine 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)
© 2022 - 2024 — McMap. All rights reserved.
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. – Behistunnull
andNone
in python here. – Kayleen