如何确定一个Pythonvariables的types?
我如何看到一个variables的types,无论是无符号的32位,有符号的16位等?
我如何查看?
Python没有C / C ++types,这似乎是你的问题。
尝试这个:
>>> 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中消失了。
您可能正在寻找type()
函数。
看下面的例子,但Python中没有像Java那样的“无符号”types。
正整数:
>>> v = 10 >>> type(v) <type 'int'>
大正整数:
>>> v = 100000000000000 >>> type(v) <type 'long'>
负整数:
>>> v = -10 >>> type(v) <type 'int'>
文字字符序列:
>>> v = 'hi' >>> type(v) <type 'str'>
这是如此简单。 你这样做。
print(type(variable_name))
如何确定Python中的variablestypes?
所以如果你有一个variables,例如:
one = 1
你想知道它的types?
有正确的方法和错误的方式来做几乎所有的Python。 这是正确的方法:
使用type
>>> type(one) <type 'int'>
您可以使用__name__
属性来获取对象的名称。 (这是您需要使用__dunder__
名称才能实现的less数几个特殊属性之一 – 在inspect
模块中甚至没有它的方法。)
>>> type(one).__name__ 'int'
不要使用__class__
在Python中,以下划线开头的名称在语义上不是公共API的一部分,对于用户来说,避免使用它们是最好的做法。 (除非绝对必要)
由于type
给我们的对象的类,我们应该避免直接得到这个。 :
>>> one.__class__
这通常是人们在访问方法中的对象types时的第一个想法 – 他们已经在寻找属性,所以types看起来很奇怪。 例如:
class Foo(object): def foo(self): self.__class__
别。 相反,请键入(self):
class Foo(object): def foo(self): type(self)
整数和浮点数的实现细节
我如何看到一个variables的types,无论是无符号的32位,有符号的16位等?
在Python中,这些细节是实现细节。 所以,一般来说,我们通常不用担心Python。 但是,要满足你的好奇心
在Python 2中,int通常是一个有符号整数,与实现的字宽相同(受系统限制)。 它通常以C语言实现 。 当整数比这更大时,我们通常将它们转换成Python longs(无限精度,不要与C longs混淆)。
例如,在一个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's)long作为int,它具有无限精度。
我们也可以得到关于Python浮点数的一些信息,这些信息通常在C:
>>> 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)来获取variables的types。 改用type
。
不要太担心Python的实现细节。 我没有必要自己处理这个问题。 你可能也不会,如果你真的这样做,你应该知道不应该为这个答案寻找做什么。
还有一种使用__class__
:
>>> a = [1, 2, 3, 4] >>> a.__class__ <type 'list'> >>> b = {'key1': 'val1'} >>> b.__class__ <type 'dict'> >>> c = 12 >>> c.__class__ <type 'int'>
这个问题有些模棱两可 – 我不确定你的意思是“观点”。 如果你试图查询本地Python对象的types, @atzz的答案将引导你正确的方向。
但是,如果您正在尝试生成具有原始Ctypes语义的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
模块中,它可以使这些低级types的数组:
>>> 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位整数。
在第二种情况下,可以使用type()
:
>>> import ctypes >>> a = ctypes.c_uint() # unsigned int >>> type(a) <class 'ctypes.c_ulong'>
有关ctypes的更多信息,请参阅官方文档 。
print type(variable_name)
在处理这样的问题时,我也强烈推荐IPython交互式解释器。 它可以让你inputvariable_name?
并将返回关于该对象的所有信息列表,包括该types的types和文档string。
例如
In [9]: var = 123 In [10]: var? Type: int Base Class: <type 'int'> String Form: 123 Namespace: Interactive Docstring: int(x[, base]) -> integer Convert a string or number to an integer, if possible. A floating point argument will be truncated towards zero (this does not include a string representation of a floating point number!) When converting a string, use the optional base. It is an error to supply a base when converting a non-string. If the argument is outside the integer range a long object will be returned instead.
这可能是无关紧要的。 但是您可以使用isinstance(object, type)
,如上所述。
Python没有你描述的types。 有两种types用于表示整型值: int
(它对应于C中的平台inttypes)和long
(它是一个任意的精度整数)(即它根据需要增长并且没有上限)。 如果一个expression式产生的结果不能被存储在int
int
s被默认地转换为long
。
Python中简单types检查的例子:
assert type(variable_name) == int assert type(variable_name) == bool assert type(variable_name) == list
简单,对于Python 3.4及以上
print (type(variable_name))
Python 2.7及以上版本
print type(variable_name)
这真的取决于你的意思。 在Python 2.x中,出于历史原因,有两个整型, int
(约束到sys.maxint
)和long
(无限精度)。 在Python代码中,这应该没有什么不同,因为当数字太大时,解释器会自动转换为long。 如果你想知道在底层解释器中使用的实际数据types,那就是依赖于实现的。 (CPython位于Objects / intobject.c和Objects / longobject.c中。)要了解系统types,请查看使用struct模块的cdleary答案。
对于python2.x,请使用
print type(variable_name)
对于python3.x,请使用
print(type(variable_name))