题 如何确定Python变量的类型?


如何查看变量的类型,无论是无符号32位,带符号16位等等?

我该如何看待它?


1035
2017-12-31 07:58


起源




答案:


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

但是,在Python 3.0中,int和long之间的区别消失了。


950
2017-12-31 10:43





你可能正在寻找 type() 功能。

请参阅下面的示例,但Python中没有像Java那样的“unsigned”类型。

正整数:

>>> 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'>

309
2017-10-01 11:02





这很简单。你这样做。

print(type(variable_name))

135
2017-10-07 16:02





如何在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通常是一个等于实现的有符号整数  宽度(受系统限制)。它通常被实现为 长在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的)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,用于获取变量的类型。使用 type 代替。

并且不要过多担心Python的实现细节。我自己不必处理这个问题。你可能也不会,如果你真的这样做,你应该知道不要为这个答案寻找答案。


77
2018-03-18 02:48



类型出来 <type instance> 但 __class__ 给 email.message.Message - 我究竟做错了什么? - Jasen
@Jasen你使用的是Python 2而不是继承自 object? - Aaron Hall♦
是的,只是使用 import email  没有我自己的发明类。 - Jasen


再使用一种方式 __class__

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

36
2017-12-31 08:08



在Python中,以下划线开头的名称在语义上不是公共API的一部分,并且这是用户避免使用它们的最佳实践。 (除非绝对必要。) - tricasse


这个问题有点含糊不清 - 我不确定你对“观点”的意思。如果你想 询问 本机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,它返回的实际大小 蟒蛇 残余记忆中的物体:

>>> 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)

25
2017-12-31 08:02



正如我所理解的那样,问题是询问在Python中查询“变量”的类型。你的答案通常是正确但偏离主题。 - tzot


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

如果可能,将字符串或数字转换为整数。浮点参数将被截断为零(这不包括字符串 表示浮点数!)转换字符串时,请使用可选的基数。转换a时提供基数是错误的         非字符串。如果参数超出整数范围,则为长对象         将被退回。


21
2018-01-12 01:08



我问过unsigned int,signed int等 - user46646
print type(str) 在Python 3.6中返回错误。使用 type(str) - Kolob Canyon
@KolobCanyon因为在3.x中,打印需要括号: print(type(str)) - jcoppens


Python中简单类型检查的示例:

assert type(variable_name) == int

assert type(variable_name) == bool

assert type(variable_name) == list

20
2017-08-14 06:39



这就是我想要的。 - Nikhil Wagh


这可能有点无关紧要。但你可以检查一个对象的类型 isinstance(object, type) 如上所述 这里


19
2017-12-31 08:10





你的意思是 蟒蛇 或使用 ctypes的

在第一种情况下,你根本不能 - 因为Python没有签名/无符号,16/32位整数。

在第二种情况下,您可以使用 type()

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

有关ctypes的更多参考,请参阅 官方文件


18
2017-12-31 08:12