Python変数の型を判別する方法は?


回答:


1380

type()組み込み関数を使用します。

>>> i = 123
>>> type(i)
<type 'int'>
>>> type(i) is int
True
>>> i = 123.456
>>> type(i)
<type 'float'>
>>> type(i) is float
True

変数が指定されたタイプかどうかを確認するには、次を使用しますisinstance

>>> i = 123
>>> isinstance(i, int)
True
>>> isinstance(i, (float, str, set, dict))
False

Pythonには、C / C ++と同じ型がないことに注意してください。


437

組み込み関数を探している可能性がありますtype()

以下の例を参照してください。ただし、PythonにはJavaのような「符号なし」型はありません。

正の整数:

>>> v = 10
>>> type(v)
<type 'int'>

大きな正の整数:

>>> v = 100000000000000
>>> type(v)
<type 'long'>

負の整数:

>>> v = -10
>>> type(v)
<type 'int'>

文字の文字シーケンス:

>>> v = 'hi'
>>> type(v)
<type 'str'>

浮動小数点整数:

>>> v = 3.14159
>>> type(v)
<type 'float'>

これを見たとき、私はダブルテイクしなければなりませんでした。現在、Java SE8には符号なし整数が含まれており、私はそれを使って開発したので、JavaがSE8より前に符号なし整数を使用したことがなかったのは罪深いようです。
dddJewelsbbb

172

とても簡単です。あなたはこのようにします。

print(type(variable_name))

110

Pythonで変数の型を判別する方法は?

たとえば、変数がある場合、次のようになります。

one = 1

あなたはそのタイプを知りたいですか?

Pythonのほぼすべてを行うには、正しい方法と間違った方法があります。ここに正しい方法があります:

使用する type

>>> type(one)
<type 'int'>

__name__属性を使用して、オブジェクトの名前を取得できます。(これは、__dunder__名前を使用して到達する必要があるいくつかの特別な属性の1つinspectです。モジュールにはそのメソッドさえありません。)

>>> type(one).__name__
'int'

使わない __class__

Pythonでは、アンダースコアで始まる名前は意味的にパブリックAPIの一部ではないため、ユーザーが使用しないようにすることをお勧めします。(どうしても必要な場合を除きます。)

typeオブジェクトのクラスを提供するので、これを直接取得することは避けてください。:

>>> one.__class__

これは通常、メソッド内のオブジェクトのタイプにアクセスするときに最初に思いつくものです。すでに属性を探しているため、タイプは奇妙に見えます。例えば:

class Foo(object):
    def foo(self):
        self.__class__

しないでください。代わりに、type(self)を実行します。

class Foo(object):
    def foo(self):
        type(self)

intとfloatの実装の詳細

符号なし32ビット、符号付き16ビットなど、変数の型を確認するにはどうすればよいですか?

Pythonでは、これらの詳細は実装の詳細です。そのため、一般的に、Pythonでは通常これを心配する必要はありません。ただし、好奇心をそそるには...

Python 2では、intは通常、実装のワード幅に等しい符号付き整数です(システムによって制限されます)。これは通常、Cでlongとして実装されます。整数がこれより大きくなると、通常それらをPythonのlongに変換します(精度は無制限です。Cのlongと混同しないでください)。

たとえば、32ビットPython 2では、intが符号付き32ビット整数であると推定できます。

>>> import sys

>>> format(sys.maxint, '032b')
'01111111111111111111111111111111'
>>> format(-sys.maxint - 1, '032b') # minimum value, see docs.
'-10000000000000000000000000000000'

Python 3では、古いintはなくなり、intとして(Pythonの)longを使用しますこれは、精度に制限がありません

Pythonの浮動小数点数に関する情報を取得することもできます。これらは通常、Cでdoubleとして実装されています。

>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, 
min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, 
mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1)

結論

__class__変数の型を取得するために、意味的に非公開のAPIであるを使用しないでください。type代わりに使用してください。

また、Pythonの実装の詳細についてはあまり気にしないでください。私自身、これに関する問題に対処する必要はありませんでした。あなたはおそらくどちらもしないでしょう、そしてあなたが本当にそうするならば、あなたは何をすべきかについてこの答えに目を向けないように十分に知っているべきです。


タイプは出て来る<type instance>が、__class__与えるemail.message.Message-私は何を間違っているのですか?
Jasen

@Jasen Python 2を使用していobjectますか?
アーロンホール

はい、import email 自分の発明のクラスを使用していません。
-Jasen

65
print type(variable_name)

このような質問に対処する場合は、IPythonインタラクティブインタープリターも強くお勧めします。それはあなたがタイプすることを可能にしvariable_name?、タイプとタイプのためのドキュメント文字列を含むオブジェクトに関する情報の完全なリストを返します。

例えば

In [9]: var = 123

In [10]: var?
Type:       int
Base Class: <type 'int'>
String Form:    123
Namespace:  Interactive
Docstring:
    int(x[, base]) -> integer

可能であれば、文字列または数値を整数に変換します。浮動小数点引数はゼロに向かって切り捨てられます(これには浮動小数点数の文字列表現は含まれません!)文字列を変換するときは、オプションのベースを使用します。非文字列を変換するときにベースを指定すると、エラーになります。引数が整数の範囲外の場合、代わりに長いオブジェクトが返されます。


2
unsigned int、signed intなどを要求しました
user46646 2008

3
print type(str)Python 3.6でエラーを返します。使用type(str)
Kolob Canyon

4
3.xの中で、印刷は、括弧を必要とするためです@KolobCanyon:print(type(str))
jcoppens

1
実際にエラーのあるprint type(var)コードを変更する必要があります。
Han XIAO 2018

54
a = "cool"
type(a)

//result 'str'
<class 'str'>
or 
do 
`dir(a)` 
to see the list of inbuilt methods you can have on the variable.

40

もう1つの使用方法__class__

>>> a = [1, 2, 3, 4]
>>> a.__class__
<type 'list'>
>>> b = {'key1': 'val1'}
>>> b.__class__
<type 'dict'>
>>> c = 12
>>> c.__class__
<type 'int'>

1
re:コメント"アンダースコアで始まる名前..." (単一)アンダースコアは、二重アンダースコア( "dunders")とは大きく異なり、パブリックAPIの一部であり、使用しても問題ありません。これは助けになるかもしれません... youtu.be/wf-BqAjZb8M
マイケル

31

Pythonでの単純な型チェックの例:

assert type(variable_name) == int

assert type(variable_name) == bool

assert type(variable_name) == list

29

それは少し無関係であるかもしれません。ただし、ここで説明isinstance(object, type)したように、オブジェクトのタイプを確認できます


1
これは、タイプ関数よりもチェックプロセスで使用する方がはるかに優れていると思います。結果を確認して処理したい場合は、タイプを指定してtry catchを使用する必要がありますが、isinstanceはtrueまたはfalseを返します
alkanschtein

24

質問はややあいまいです-「ビュー」が何を意味するのかわかりません。ネイティブPythonオブジェクトのタイプを照会しようとしている場合、@ atzzの答えは正しい方向に導きます。

しかし、あなたがしようとしている場合に発生する(のような、プリミティブC-種類の意味を持っているPythonオブジェクトをuint32_tint16_t)、使用structモジュールを。したがって、特定のCタイププリミティブのビット数を次のように決定できます。

>>> struct.calcsize('c') # char
1
>>> struct.calcsize('h') # short
2
>>> struct.calcsize('i') # int
4
>>> struct.calcsize('l') # long
4

これはarrayモジュールにも反映されており、次の下位レベルの型の配列を作成できます。

>>> array.array('c').itemsize # char
1

サポートされる最大の整数(Python 2のint)はsys.maxintで指定されます

>>> import sys, math
>>> math.ceil(math.log(sys.maxint, 2)) + 1 # Signedness
32.0

sys.getsizeofもあります。これは、Pythonオブジェクトの実際のサイズを残りのメモリに返します。

>>> a = 5
>>> sys.getsizeof(a) # Residual memory.
12

floatデータと精度データの場合は、sys.float_infoを使用します

>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1)

7
私が理解しているように、Pythonでの「変数」のタイプのクエリについて質問します。あなたの答えは一般的に正しいですが、トピックから外れています。
tzot 2008

19

あなたはに意味するかはPythonや使用してctypesの

最初のケースでは、Pythonには符号付き/符号なしの16/32ビット整数がないため、単純にできません。

2番目のケースでは、以下を使用できますtype()

>>> import ctypes
>>> a = ctypes.c_uint() # unsigned int
>>> type(a)
<class 'ctypes.c_ulong'>

そのタイプであるctypesの詳細については、公式ドキュメントを参照してください。


15

Pythonには、あなたが説明するような型はありません。整数値を表すために使用される2つの型がありますint。Cのプラットフォームのint型に対応するlongと、任意の精度の整数です(つまり、必要に応じて大きくなり、上限はありません)。intsはlong、式がに格納できない結果を生成する場合、暗黙的にに変換されintます。



10

それはあなたが何を意味するかによります。Python 2.xでは、歴史的な理由により、int(に制限されているsys.maxint)とlong(無制限の精度)の2つの整数型があります。Pythonコードでは、数値が大きすぎる場合にインタープリターが自動的にlongに変換されるため、これは少しの違いをもたらすべきではありません。基礎となるインタープリターで使用される実際のデータ型について知りたい場合は、実装に依存します。(CPythonは、Objects / intobject.cおよびObjects / longobject.cにあります。)システムタイプについて調べるには、構造体モジュールを使用するための補助的な答えを参照してください。



-29

しないでください。何かのタイプを求めること自体は間違っています。代わりに、ポリモーフィズムを使用してください。可能なタイプの入力に対して必要なことを実行するメソッドを見つけ、必要に応じて定義し、何も尋ねずに呼び出すだけです。組み込み型またはサードパーティのライブラリで定義された型を使用する必要がある場合は、常にそれらから継承して、代わりに独自の派生物を使用できます。または、独自のクラス内にラップすることもできます。これは、そのような問題を解決するためのオブジェクト指向の方法です。

正確な型をチェックし、ダーティifsをあちこちに配置することを主張する場合、__class__プロパティまたはtype関数を使用してそれを行うことができますが、すぐifに2つまたは3つのコミットごとに追加のケースでこれらすべてのsを更新することがわかります。それをOOの方法で行うことでそれを防ぎ、代わりに新しいタイプの入力に対してのみ新しいクラスを定義することができます。


4
この回答が既存の回答に何を追加したのか本当にわかりません(おそらく最初の文を超えていますか?)
user2305193
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.