PythonでNoneTypeを「テスト」する方法は?


398

NoneType値を時々返すメソッドがあります。では、NoneTypeである変数に質問するにはどうすればよいですか?たとえば、ifメソッドを使用する必要があります

if not new:
    new = '#'

私はそれが間違った方法であることを知っています。私が何を意味するのか理解していただければ幸いです。


これが答えた私だと思うここで前にどこかと明らかに
yorodm

場合はNoneこれのためにのみ値あなたのメソッドの戻りでbool(returnValue)等しくFalse、その後、if not new:罰金を働かせるべきです。これは、組み込みライブラリで時々発生します-たとえば、re.matchNoneまたは真の一致オブジェクトのいずれかを返します。
ケビン

また、についての私の答えを参照nullしてNonepythonでここに
Michael Ekoka

回答:


631

では、NoneTypeである変数に質問するにはどうすればよいですか?

isこのように演算子を使う

if variable is None:

なぜこれが機能するのですか?

以来Noneの唯一のシングルトンオブジェクトであるNoneTypePythonでは、我々が使用できるis変数が持っているかどうかを確認する作業をNoneその中かどうか。

isドキュメントからの引用、

事業者isis notオブジェクトのアイデンティティのためのテストは:x is y場合にのみ、真であるxy同じオブジェクトです。x is not y逆の真理値を生成します。

のインスタンスは1つしか存在できないためNoneisを確認する方法としてが推奨されNoneます。


馬の口から聞く

Pythonのコーディングスタイルガイドラインの引用-PEP-008(Guido自身が共同で定義)、

のようなシングルトンとの比較Noneは常にisoris not行う必要あり、等値演算子は使用しないでください


では、== Noneとはis Noneどう違いますか?
NoName

@NoNameに関してはNone、どちらも同じ結果になります。
thefourtheye

2
かどうかを比較する場合は、この作業をしないpandasことのために、私が使用-データフレームが存在しているtype(df) is type(None):避けるためにThe truth value of a DataFrame is ambiguous
マルク・Maxmeister


27

アレックスホールの答えisinstanceに従っても行うことができます

>>> NoneType = type(None)
>>> x = None
>>> type(x) == NoneType
True
>>> isinstance(x, NoneType)
True

isinstance も直感的ですが、ラインを必要とするという複雑さがあります

NoneType = type(None)

intおよびのような型には必要ありませんfloat


あなたがサブクラス化することはできませんので、NoneTypeそれ以来Noneシングルトンで、isinstance検出するために使用すべきではないNone-受け入れ答えが言うように代わりにあなたが行う必要があり、使用is Noneまたはis not None
アーロンホール

18

アーロン・ホールのコメントで指摘されているように:

あなたがサブクラス化することはできませんので、NoneTypeそれ以来Noneシングルトンで、isinstance検出するために使用すべきではないNone-受け入れ答えが言うように代わりにあなたが行う必要があり、使用is Noneまたはis not None


元の回答:

ただし、カルダモンの回答に加えて追加の行がない場合、最も簡単な方法はおそらく次のとおりです。
isinstance(x, type(None))

では、NoneTypeである変数に質問するにはどうすればよいですか?ifメソッドを使用する必要があります

を使用isinstance()するis場合、if-statement 内は必要ありません。

if isinstance(x, type(None)): 
    #do stuff

追加情報またドキュメントに記載されているように、
1つのisinstance()ステートメントで複数のタイプを確認することもできます。タイプをタプルとして書くだけです。

isinstance(x, (type(None), bytes))

1
あなたがサブクラス化することはできませんので、NoneTypeそれ以来Noneシングルトンで、isinstance検出するために使用すべきではないNone-受け入れ答えが言うように代わりにあなたが行う必要があり、使用is Noneまたはis not None
アーロンホール

1
この回答は役に立ちましたpython 3.6.7
Santhosh Dhaipule Chandrakanth 2018

@AaronHallなぜ使用isinstance すべきではないのですか?私はそれisを優先する必要があることを理解していますが、インスタンスインスタンスフォームがより自然に感じられる場合があります(一度に複数の型をチェックするなどisinstance(x, (str, bool, int, type(None))))。それは単なる個人的な好みですか、それとも私が知らないという警告がありますか?
コンキリクリトール

@Conchylicultorはあなたの提案に不利です:1.のグローバルルックアップtype2.次にそれを呼び出す3.次にタイプを検索しますNone- Noneがシングルトンとキーワードの両方である場合。別の欠点:4.これは非常に非標準であり、人々があなたのコードを見ているときに眉をひそめるでしょう。x is Noneより最適化されたチェックです。私はお勧めx is None or isinstance(x, (str, bool, int))しますが、あまり一般的でない型についてそのような型チェックを行うときは、あなたが何をしているのかについてもっと考えることをお勧めします...
アーロンホール

4

これが質問に答えるかどうかはわかりません。しかし、これを理解するにはしばらく時間がかかりました。私はWebサイトをループしていましたが、突然、著者の名前がなくなっていました。したがって、チェックステートメントが必要でした。

if type(author) == type(None):
     my if body
else:
    my else body

この場合、作成者は任意の変数にNoneすることができ、チェックする任意のタイプにすることができます。


Noneはシングルトンなので、type検出には使用しないでください。None代わりに、受け入れられた回答にあるようにして、is Noneまたはを使用する必要がありis not Noneます。
アーロンホール

2

Python 2.7:

x = None
isinstance(x, type(None))

または

isinstance(None, type(None))

==>正しい


1
あなたがサブクラス化することはできませんので、NoneTypeそれ以来Noneシングルトンで、isinstance検出するために使用すべきではないNone-受け入れ答えが言うように代わりにあなたが行う必要があり、使用is Noneまたはis not None
アーロンホール

よし!よろしくお願いします!
ペスコ2018

0

この例がお役に立てば幸いです)

print(type(None) # NoneType

だから、あなたは変数名のタイプをチェックすることができます

#Example
name = 12 # name = None
if type(name) != type(None):
    print(name)
else:
    print("Can't find name")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.