きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Pythonでインスタンスが自作型ではなく、組込み型(built-in types)であることを判別する(isinstance)(primitive types)

Pythonにて処理する際のインスタンスが組込み型(built-in types)であることを判別したかったのですが、簡単にはできませんでした。もし、簡易にできるようになったら、教えてください。

なお、組込み型(built-in types)とは、Pythonが定義しているstr, int等々の最初から定義されている型のことを指します。Code SmellとしてはPrimitive Obsession(基本データ型への執着)という名前が使われているので、Primitive型といっても問題ないと思われますが、今回の記事ではPythonの公式ヘルプで表現されている組込み型(built-in types)を使用します。

環境

  • Python
    • 3.9

対応

Pythonに概念としては組込み型は存在しますが、組込み型一覧を取得できる機能はありません。そのため、必要に応じて判別したい組込み型をすべて定義する必要があります。

isinstanceメソッド

ざきさんに型判別のメソッドisinstance(object, classinfo)を教えていただきました。感謝です。

使い方としては、第一引数にチェックしたいオブジェクトを設定します。第二引数にチェック対象の型を定義します。Python3.10以降より、Turpleだけでなく、Union Typesでも定義できるようになりました。

# 3.9以前
isinstance(target, (str, int, bool))
# 3.10以降
isinstance(target, str | int | bool)

typeメソッド

type(object)を使用すると、チェックしたいオブジェクトの型を取得できます。チェック対象の型を配列に設定すると、比較できます。

Stack Overflowではこちらの方法で定義していました。

type(target) in [str, int, bool]

実運用では自作型はルートに配備せず、適切なディレクトリに配備するでしょう。ですので、「型が.を含む場合は自作型である」と判別しようとしました。

ただし、このやり方だとdatetime.datetime等々も自作型として判別されてしまうので使えません。すべての組込み型を定義するのは面倒ですので、こうできればよかったのですが、現実はうまくいきませんでした。

"." in str(type(value))
# <class 'int'>
# <class 'str'>
# <class 'bool'>
# <class 'list'>
# <class 'datetime.date'>

ソースコード

終わりに

雑にハンドリングしたかったのですが、ダメでした。

正直、この処理をやりたい時というのはかなりトリッキーなやり方ではあるとは自覚しているので、言語側から提供はしてくれないと思うのですが、もう少し簡易にハンドリングしたかったです。

参考情報