如何查看变量的类型?(例如无符号32位)


当前回答

这可能无关紧要。但您可以使用isinstance(object,type)检查对象的类型,如这里所述。

其他回答

还有一种使用__class__的方法:

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

这很简单。你这样做。

print(type(variable_name))

你的意思是用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交互式解释器。它允许您键入variable_name?并将返回关于对象的完整信息列表,包括类型和类型的文档字符串。

e.g.

In [9]: var = 123

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

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

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

因此,如果您有一个变量,例如:

one = 1

你想知道它的类型吗?

在Python中,有正确的方法和错误的方法可以做任何事情。这是正确的方法:

使用类型

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

您可以使用__name__属性获取对象的名称。(这是少数需要使用__dunder__名称才能访问的特殊属性之一——inspect模块中甚至没有一个方法。)

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

不要使用__class__

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

由于类型为我们提供了对象的类,因此我们应该避免直接获取该类

>>> one.__class__

这通常是人们在访问方法中对象类型时的第一个想法——他们已经在寻找属性,所以类型看起来很奇怪。例如:

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

不要。而是键入(self):

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

int和float的实现细节

如何查看变量的类型,无论它是无符号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'

在Python3中,旧的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)

结论

不要使用__class__(一个语义上非公共的API)来获取变量的类型。请改用类型。

不要太担心Python的实现细节。我不必亲自处理这方面的问题。你可能也不会,如果你真的这样做了,你应该知道,不要去寻找这个答案。