如何确定Python变量的类型?


Answers:


1379

使用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 ++的类型不同,这似乎是您的问题。


437

您可能正在寻找内置功能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'>

看到这个,我不得不加倍。Java SE8现在包含无符号整数,并且我已经用它开发了很多东西,以至于Java在SE8之前从未拥有过无符号整数似乎是罪恶的。
dddJewelsbbb

171

很简单。你是这样做的。

print(type(variable_name))

110

如何在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__

别。相反,请执行type(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'

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

结论

不要使用__class__语义上非公共的API来获取变量的类型。使用type代替。

而且不必太担心Python的实现细节。我自己不必处理这个问题。您可能也不会这样做,而且如果您确实做到了,那么您应该了解得足够多,不要去寻找该答案的答案。


类型出来,<type instance>__class__给出email.message.Message-我在做什么错?
杰森

@Jasen您是否正在使用Python 2并且未继承object
亚伦·霍尔

是的,只是不使用import email 我自己发明的任何类。
杰森

65
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

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


2
我要求提供未签名的int,已签名的int等
user46646

3
print type(str)在Python 3.6中返回错误。使用type(str)
Kolob峡谷

4
@KolobCanyon那是因为在3.x版本中,打印需要print(type(str))
加上

1
您应该真正修改print type(var)错误的代码。
萧汉'18

54
a = "cool"
type(a)

//result 'str'
<class 'str'>
or 
do 
`dir(a)` 
to see the list of inbuilt methods you can have on the variable.

40

另一种使用方式__class__

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

1
回复:注释“以下划线开头的名称...”(单)下划线与双下划线(“ dunders”)有很大不同,它们绝对是公共API的一部分,使用它们当然可以。这可能会有所帮助... youtu.be/wf-BqAjZb8M
迈克尔

31

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

assert type(variable_name) == int

assert type(variable_name) == bool

assert type(variable_name) == list

29

可能没什么关系。但是您可以isinstance(object, type)此处所述检查对象的类型。


1
我认为这比在检查过程中使用类型函数更好。如果要检查结果并采取措施,则必须使用try catch类型,但isinstance返回true或false
alkanschtein19年

24

这个问题有点模棱两可-我不确定您所说的“视图”是什么意思。如果您要查询本机Python对象的类型,@ 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('c').itemsize # char
1

sys.maxintint给出了支持的最大整数(Python 2 )。

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

对于浮点数据和精度数据,请使用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)

7
据我了解,该问题询问有关在Python中查询“变量”类型的问题。您的答案通常是正确的,但题外话。
tzot

19

您是在Python还是使用ctypes

在第一种情况下,您根本无法-因为Python没有带符号/无符号的16/32位整数。

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

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

有关ctypes及其类型的更多参考,请参见官方文档


15

Python没有您描述的类型。有两种类型用于表示整数值:int,对应于C中平台的int类型,以及long,它是任意精度的整数(即,它可以根据需要增长并且没有上限)。如果表达式产生的结果无法存储在中intlong则将s静默转换为int


11

简单,适用于python 3.4及更高版本

print (type(variable_name))

Python 2.7及更高版本

print type(variable_name)

10

这实际上取决于您的意思。在Python 2.x中,出于历史原因,存在两种整数类型,int(限制为sys.maxint)和long(精度不受限制)。在Python代码中,这没有什么区别,因为当数字太大时,解释器会自动转换为long。如果您想了解底层解释器中使用的实际数据类型,则取决于实现。(CPython位于Objects / intobject.c和Objects / longobject.c中。)要了解系统类型,请查看使用struct模块的答案。


7

对于python2.x,请使用

print type(variable_name)

对于python3.x,请使用

print(type(variable_name))

-29

只是不要这样做。要求某种类型本身是错误的。而是使用多态。查找或根据需要自己定义对任何可能的输入类型都可以执行所需操作的方法,然后直接调用它而无需询问任何内容。如果需要使用内置类型或第三方库定义的类型,则始终可以从它们继承并使用自己的派生类。或者,您也可以将它们包装在自己的类中。这是解决此类问题的面向对象的方法。

如果您坚持检查确切的类型并在各处乱放一些ifs,则可以使用__class__property或typefunction来做到这一点,但是很快您将发现自己if每隔两到三次提交就用所有其他情况来更新所有这些s。OO方法可以防止这种情况的发生,而只能让您为新的输入类型定义新的类。


4
我真的不知道这个答案会添加到现有答案中(可能超出第一句话吗?)
user2305193
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.