Python 変数が辞書かどうかをチェックする

変数はデータを格納するための容器として機能します。開発者は変数を作成するときや引数を渡すときに型ヒントを使うことができますが、これはPythonのオプション機能であり、古今東西多くのコードベースではまだ型ヒントが使われていないのが現状です。Pythonの変数には、格納される型の情報がないことの方が一般的です。

もし、辞書が必要なのに型ヒントがないコードがあったとして、使用される変数が辞書でない場合、どのようにしてエラーを回避できるでしょうか?

このチュートリアルでは、 type()isinstance() 関数、そして is 演算子を用いて、Python で変数が辞書であるかどうかをチェックする方法を見ていきます。

  • type() で変数が辞書かどうかを確認する。
  • is 演算子で変数が辞書かどうかを確認する。
  • isinstance() で Variable が Dictionary であるかどうかをチェックする。

開発者は通常、 type()is を使用しますが、文脈によっては、これらは制限されることがあります。その場合は、 isinstance() 関数を使用したほうがよいでしょう。

type()で変数が辞書かどうか確認する

type()関数を使用すると、任意の変数の型を即座に取得することができます。Dictionary 型の変数に対しては、 <class 'dict'="" を返す必要があります。

squares = {1: 1, 2: 4, 3: 9}
print(type(squares))


という結果になります。

<class 'dict'=""


変数が辞書であるかどうかをis演算子で確認する

Python では、is は同一性演算子です。これは、オペランドが互いに同一であるかどうかを確認する演算子です。同一であるということは、同じメモリ上の場所を参照していることを意味します。

is演算子は、変数とdictクラスを指定してtype()を呼び出した結果に対して使用することができます。この演算子はtype()dictクラスと同じメモリ上の場所を指している場合にのみTrueを出力します。そうでない場合は、False` を出力します。

サニティチェックとして、id() 関数を使ってメモリ上のオブジェクトのアドレスを取得し、比較を検証することができます。

squares = {1: 1, 2: 4, 3: 9}
print(type(squares) is dict)  # True
print("memory address of type(squares):", id(type(squares)))
print("memory address of dict:", id(dict))  # Should have same ID as type(squares)


このコードはPythonインタープリター上で次のような出力を生成します。

True
memory address of type(squares): 1609576584
memory address of dict: 1609576584


注意: メモリ上のアドレスはあなたにとって異なるかもしれませんが、 type(squares)dict の両方には同じIDが存在するはずです。

この方法の注意点として、変数が dict のサブクラスである場合は動作しないことが挙げられます。例えば、先ほどのコードは squares という変数が Ordered Dictionary であった場合にはうまくいきません。

from collections import OrderedDict


squares = OrderedDict([(1, 1), (2, 4), (3, 9)])
print(type(squares) is dict)  # False
print("memory address of type(squares):", id(type(squares)))
print("memory address of dict:", id(dict))  # Different ID as they're different classes


これは次のように出力されます。

False
memory address of type(squares): 9464512
memory address of dict: 9481952


もし、あなたのコードが辞書のサブクラスで動作する必要がある場合は、 isinstance() メソッドを使用することをお勧めします。

isinstance()で変数がDictionaryかどうか確認する。

is演算子は、両方のオブジェクトのメモリアドレスが同じであればTrueを返すことを見てきました。もし、クラスdictを継承した Dictionary があれば、それはFalseを返します。例えば、OrderedDictdefaultdictなどのdictのサブクラスの辞書は、dict` と同じメモリアドレスを指すことはないだろう。

ここで、 isinstance() 関数が役に立ちます。この関数は2つの引数、オブジェクトとクラスを受け取ります。もし、オブジェクトがクラスまたはそのサブクラスのインスタンスであれば、 True を返します。オブジェクトが与えられたクラスのインスタンスでない場合、直接であれ間接であれ、 False を返します。

以下は、isinstance() 関数を使って変数が Dictionary であるかどうかを確認するコード例です。

from collections import OrderedDict


# Variable of type dict
squares = {1: 1, 2: 4, 3: 9}
print(isinstance(squares, dict))  # True


# Variable of type OrderedDict (Subclass of dict)
cubes = OrderedDict(((1, 1), (2, 8)))
print(isinstance(cubes, dict))  # True


このコードはPythonインタープリター上で次のような出力を生成します。

True
True


結論

このチュートリアルでは、変数がDictionaryであるかどうかを確認する方法を紹介しました。まず、任意の Dictionary オブジェクトに対して <class 'dict'="" を出力する type() 関数について見てきました。次に、 is 演算子を使用して、変数の型がメモリ上の dict を指しているかどうかをチェックする方法を説明しました。この演算子は True または False を返します。

最後に、 is は継承された Dictionary オブジェクトを識別するのに失敗することを見てきました。継承されたオブジェクトを捕捉したい場合は、 isinstance() 関数を使用することができます。この関数は、オブジェクトが直接または間接的に与えられたクラス (この記事では dict) のインスタンスである場合は True を、そうでない場合は False を返します。

これらのメソッドはどちらも TrueFalse を返すので、条件文の中で簡単に使用することができます。明示的に dict のサブクラスを拒否したい場合を除き、 isinstance() 関数は変数が Dictionary であるかどうかを確認する最も信頼できる方法です。

</class

タイトルとURLをコピーしました