符号なし32ビット、符号付き16ビットなど、変数の型を確認するにはどうすればよいですか?
どうやって見るの?
符号なし32ビット、符号付き16ビットなど、変数の型を確認するにはどうすればよいですか?
どうやって見るの?
回答:
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 ++と同じ型がないことに注意してください。
組み込み関数を探している可能性があります。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'>
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)
符号なし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
-私は何を間違っているのですか?
object
ますか?
import email
自分の発明のクラスを使用していません。
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
可能であれば、文字列または数値を整数に変換します。浮動小数点引数はゼロに向かって切り捨てられます(これには浮動小数点数の文字列表現は含まれません!)文字列を変換するときは、オプションのベースを使用します。非文字列を変換するときにベースを指定すると、エラーになります。引数が整数の範囲外の場合、代わりに長いオブジェクトが返されます。
print type(str)
Python 3.6でエラーを返します。使用type(str)
print(type(str))
print type(var)
コードを変更する必要があります。
もう1つの使用方法__class__
:
>>> a = [1, 2, 3, 4]
>>> a.__class__
<type 'list'>
>>> b = {'key1': 'val1'}
>>> b.__class__
<type 'dict'>
>>> c = 12
>>> c.__class__
<type 'int'>
質問はややあいまいです-「ビュー」が何を意味するのかわかりません。ネイティブPythonオブジェクトのタイプを照会しようとしている場合、@ atzzの答えは正しい方向に導きます。
しかし、あなたがしようとしている場合に発生する(のような、プリミティブC-種類の意味を持っているPythonオブジェクトをuint32_t
、int16_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)
あなたはに意味するかはPythonや使用してctypesの?
最初のケースでは、Pythonには符号付き/符号なしの16/32ビット整数がないため、単純にできません。
2番目のケースでは、以下を使用できますtype()
。
>>> import ctypes
>>> a = ctypes.c_uint() # unsigned int
>>> type(a)
<class 'ctypes.c_ulong'>
そのタイプであるctypesの詳細については、公式ドキュメントを参照してください。
それはあなたが何を意味するかによります。Python 2.xでは、歴史的な理由により、int
(に制限されているsys.maxint
)とlong
(無制限の精度)の2つの整数型があります。Pythonコードでは、数値が大きすぎる場合にインタープリターが自動的にlongに変換されるため、これは少しの違いをもたらすべきではありません。基礎となるインタープリターで使用される実際のデータ型について知りたい場合は、実装に依存します。(CPythonは、Objects / intobject.cおよびObjects / longobject.cにあります。)システムタイプについて調べるには、構造体モジュールを使用するための補助的な答えを参照してください。
しないでください。何かのタイプを求めること自体は間違っています。代わりに、ポリモーフィズムを使用してください。可能なタイプの入力に対して必要なことを実行するメソッドを見つけ、必要に応じて定義し、何も尋ねずに呼び出すだけです。組み込み型またはサードパーティのライブラリで定義された型を使用する必要がある場合は、常にそれらから継承して、代わりに独自の派生物を使用できます。または、独自のクラス内にラップすることもできます。これは、そのような問題を解決するためのオブジェクト指向の方法です。
正確な型をチェックし、ダーティif
sをあちこちに配置することを主張する場合、__class__
プロパティまたはtype
関数を使用してそれを行うことができますが、すぐif
に2つまたは3つのコミットごとに追加のケースでこれらすべてのsを更新することがわかります。それをOOの方法で行うことでそれを防ぎ、代わりに新しいタイプの入力に対してのみ新しいクラスを定義することができます。