web-dev-qa-db-ja.com

Python変数の型を判断する方法

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

どうやって見るの?

1249
user46646

PythonにはC/C++と同じ型はありません。

これを試して:

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

Intとlongの違いは、Python 3.0ではなくなりました。

1123
gregjor

あなたは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'>
367
Srikanth

とても簡単です。あなたはそれをこうやってやります。

print(type(variable_name))
151
Vaibhav

Pythonで変数タイプを判断する方法

たとえば変数があるとします。

one = 1

あなたはその種類を知りたいですか?

Pythonですべてについて正しいことをする方法と間違った方法があります。正しい方法は次のとおりです。

typeを使う

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

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

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

__class__を使用しない

Pythonでは、アンダースコアで始まる名前は意味的にはパブリックAPIの一部ではないため、ユーザーがそれらを使用しないようにするのがベストプラクティスです。 (どうしても必要な場合を除く)

typeは私たちにオブジェクトのクラスを与えるので、これを直接取得することは避けるべきです。 :

>>> one.__class__

これは通常、メソッド内でオブジェクトの型にアクセスするときに最初に考えられることです - 彼らはすでに属性を探しているので、型は奇妙に思えます。例えば:

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

しないでください。代わりに、(self)と入力してください。

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

インとフロートの実装詳細

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

Pythonでは、これらの詳細は実装の詳細です。そのため、一般的に、私たちは通常Pythonでこれについて心配しません。しかし、あなたの好奇心を満たすために...

Python 2では、intは通常、実装の Word widthに等しい符号付き整数です(システムによる制限)。通常は C言語では長い として実装されています。整数がこれより大きくなると、通常、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としてlong(Pythonの)を使います。これは 無制限の精度 を持ちます。

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)

結論

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

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

93
Aaron Hall
print type(variable_name)

このような質問に取り組むときは、 IPython 対話型インタプリタを強くお勧めします。それはあなたがvariable_name?とタイプすることを可能にし、タイプとタイプのためのdoc文字列を含むオブジェクトに関する情報の全リストを返すでしょう。

例えば.

In [9]: var = 123

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

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

52

__class__を使うもう一つの方法:

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

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

assert type(variable_name) == int

assert type(variable_name) == bool

assert type(variable_name) == list
28
anh_ng8

質問は多少あいまいです - 私はあなたが "ビュー"によって何を意味するのかわかりません。もしあなたが query をネイティブPythonオブジェクトの型にしようとしているなら、 @atzz の答えは正しい方向へあなたを導いてくれるでしょう。

ただし、プリミティブCタイプのセマンティクスを持つPythonオブジェクト(uint32_tint16_tなど)を generate にする場合は、 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

浮動小数点データと精度データの場合は、 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)
24
cdleary

それはほとんど無関係かもしれません。しかし、 here のようにisinstance(object, type)でオブジェクトの型をチェックすることができます。

21
skjoshi

Python または ctypes を使用するという意味ですか?

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

後者の場合、type()を使用できます。

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

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

18
rob

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

15
atzz

Python 3.4以上では単純

print (type(variable_name))

Python 2.7以上

print type(variable_name)
10
Priyansh

それは本当にあなたがどのレベルを意味するかによって異なります。 Python 2.xでは、歴史的な理由により、intsys.maxintに制限されている)とlong(精度が制限されていない)の2つの整数型があります。 Pythonコードでは、数値が大きすぎるとインタプリタが自動的にlongに変換するので、これは少しの違いはありません。基礎となるインタプリタで使用されている実際のデータ型について知りたい場合は、実装に依存します。 (CPythonはObjects/intobject.cとObjects/longobject.cにあります。)システムタイプについて知るためには、structモジュールを使うための答えを見てください。

10
a = "cool"
type(a)
//result
<class 'str'>

or do `dir(a)` to see the list of inbuilt methods you can have on the variable.
7
lilhamad

Python2.xの場合は、

print type(variable_name)

Python3.xの場合は、

print(type(variable_name))
6
Prince Dhadwal