如何判断python变量中的数据类型?

时间:2010-07-14 22:24:53

标签: python types detection

我有一个变量列表..列表中有字符串,数字和类对象。我需要根据每种不同类型的数据执行逻辑。我在检测类对象和分支逻辑时遇到问题。

if(type(lists[listname][0]).__name__ == 'str'): # <--- this works for strings
elif(type(lists[listname][0]).__name__ == 'object'): <--- this does not work for classes

在上面第二行代码中, name 变量包含“Address”作为类名。我希望它包含“类”或“对象”所以我可以分支我的程序。我将来会有很多不同类型的对象,所以在每个不同的类名“地址”“人”等上执行逻辑是不切实际的

如果我的问题需要澄清,请告诉我。

谢谢!

4 个答案:

答案 0 :(得分:4)

仅供参考:如果它是一个新风格的类,它也会有所不同:

# python
type(1).__name__
'int'
type('1').__name__
'str'
class foo(object):
  pass
type(foo()).__name__
'foo'
class bar:
  pass
type(bar()).__name__
'instance'

如果你可以确保它们都是新式的类,你的方法将决定真正的类型。如果你把它们变成旧式,它将显示为“实例”。并不是说我建议只为此制作所有旧式的。

但是,您可以更进一步:

type(bar().__class__).__name__
'classobj'
type(foo().__class__).__name__
'type'

始终寻找'classobj'或'type'。 (或者元类的名称,如果有的话。)

答案 1 :(得分:2)

我想你想要isinstance功能。

if isinstance(o, ClassName):

但是,您需要先验证o是否为对象,然后才能使用type

答案 2 :(得分:2)

在Python中常见的是使用异常处理来决定采用哪个代码路径;不鼓励检查对象的确切类型(使用isinstance())来决定如何处理它。

例如,假设您想要做的是,如果它是一个字符串,则将其打印在“标题大小写”中,如果它是一个对象,则需要在其上调用特定方法。所以:

try:
    # is it an object with a particular method?
    lists[listname][0].particularMethod()
except AttributeError:
    # no, it doesn't have particularMethod(), 
    # so we expect it to be a string; print it in title case
    print lists[listname][0].title()

答案 3 :(得分:-1)

如果您只对具体处理两种类型感兴趣,可以使用isinstance显式测试它们,然后处理剩余物:

import numbers

for item in list:
    if isinstance(item, basestring): # (str, unicode)
        do_string_thing(item)
    elif isinstance(item, numbers.Real): # (int, float, long)
        do_number_thing(item)
    else:
        do_object_thing(item)