Pythonオブジェクトのタイプを判別する
オブジェクトのタイプを決定する type
>>> obj = object()
>>> type(obj)
<class 'object'>
機能しますが、次のような二重のアンダースコア属性は避け__class__
てください-それらは意味的にはパブリックではありません。
>>> obj.__class__ # avoid this!
<class 'object'>
型チェック
変数がリスト、辞書、または何か他のものであるかどうかを判断する簡単な方法はありますか?どちらかのタイプのオブジェクトを取得していますが、その違いを区別できるようにする必要があります。
まあそれは別の質問です、タイプを使用しないでください-使用isinstance
:
def foo(obj):
"""given a string with items separated by spaces,
or a list or tuple,
do something sensible
"""
if isinstance(obj, str):
obj = str.split()
return _foo_handles_only_lists_or_tuples(obj)
これは、ユーザーがサブクラス化によって賢いまたは賢明な何かをしている場合をカバーしますstr
-Liskov Substitutionの原則に従って、コードを壊すことなくサブクラスインスタンスを使用できるようにしたい- isinstance
これをサポートします。
抽象化を使用する
さらに良いのは、collections
またはから特定の抽象基本クラスを探すことですnumbers
。
from collections import Iterable
from numbers import Number
def bar(obj):
"""does something sensible with an iterable of numbers,
or just one number
"""
if isinstance(obj, Number): # make it a 1-tuple
obj = (obj,)
if not isinstance(obj, Iterable):
raise TypeError('obj must be either a number or iterable of numbers')
return _bar_sensible_with_iterable(obj)
または、明示的に型チェックを行わないでください
または、おそらく何よりも、ダックタイピングを使用し、コードを明示的に型チェックしないでください。ダックタイピングは、よりエレガントで冗長性の低いLiskov Substitutionをサポートします。
def baz(obj):
"""given an obj, a dict (or anything with an .items method)
do something sensible with each key-value pair
"""
for key, value in obj.items():
_baz_something_sensible(key, value)
結論
type
実際にインスタンスのクラスを取得するために使用します。
isinstance
実際のサブクラスまたは登録された抽象化を明示的にチェックするために使用します。
- そして、意味のある場所で型チェックをしないでください。