符号なし整数 - Python変数の型を決定するには?




python 符号なし整数 (10)

Pythonで変数の型を調べるには?

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

one = 1

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

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

type使用する

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

__name__属性を使用すると、オブジェクトの名前を取得できます。 (これは__dunder__という名前を使用して取得するために必要な少数の特殊な属性の1つです__dunder__モジュールにはメソッドがありません)。

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

__class__使用しないでください

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

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

>>> one.__class__

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

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

しないでください。 代わりに、(自己)をタイプしてください:

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

intとfloatの実装の詳細

符号なし32ビット、符号付き16ビットなど、どのように変数の型を見ることができますか?

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

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

また、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の実装の詳細についてはあまり心配しないでください。 私は自分の周りの問題に対処する必要はありませんでした。 あなたはおそらくどちらにもなりません。あなたが本当にやるなら、あなたは何をすべきかについてこの答えを見ないほど十分に知るべきです。

符号なし32ビット、符号付き16ビットなど、どのように変数の型を見ることができますか?

どのように表示しますか?


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

assert type(variable_name) == int

assert type(variable_name) == bool

assert type(variable_name) == list

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


python2.xの場合、

print type(variable_name)

python3.xの場合は、

print(type(variable_name))

あなたはPythonctypesを使っているのですか?

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

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

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

そのタイプであるctypesの詳細については、公式文書を参照してください。


あなたはtype()関数を探しているかもしれません。

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

正の整数:

>>> 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 2.xには、歴史的な理由から、 intsys.maxint制約されてsys.maxint )とlong (無制限の精度)の2つの整数型があります。 Pythonコードでは、数字が大きすぎるとインタプリタが自動的に長時間に変換されるため、少し違いはありません。 基礎となるインタプリタで使用される実際のデータ型について知りたければ、それは実装に依存します。 (CPythonはObjects / intobject.cとObjects / longobject.cにあります)。システムタイプについて知るには、structモジュールを使うためのcdleary答えを見てください。


ほとんど無関係かもしれません。 here述べたようにisinstance(object, type)タイプをチェックすることができhere


質問は多少あいまいです。あなたが「ビュー」を意味するかどうかはわかりません。 ネイティブのPythonオブジェクトの型を問い合せようとすると、 @atzzの答えはあなたを正しい方向に@atzzます。

しかし、プリミティブなCタイプ(例えば、 uint32_tint16_t )のセマンティクスを持つPythonオブジェクトを生成しようとする場合は、 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.array('c').itemsize # char
1

サポートされている最大整数(Python 2のint )は、 sys.maxintによって与えられ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.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)

print type(variable_name)

私はまた、このような質問に対処する際に、 IPythonインタラクティブなインタプリタをお勧めします。 variable_name?と入力することができます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

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





16-bit