判断Python变量是否为内置类型的实例

42 投票
12 回答
21954 浏览
提问于 2025-04-15 13:49

我想知道一个Python变量是不是基本类型,比如:str(字符串)、int(整数)、float(浮点数)、bool(布尔值)、list(列表)、dict(字典)等等。有没有简单优雅的方法来判断呢?

还是说,这就是唯一的方法:

if myvar in (str, int, float, bool):
    # do something

12 个回答

12

我不知道你为什么想这么做,因为在Python里没有“简单”的类型,所有的东西都是对象。不过,这样做是可以的:

type(theobject).__name__ in dir(__builtins__)

不过,明确列出类型可能更好,因为这样更清晰。更好的办法是:改变应用程序,这样你就不需要知道这些区别了。

更新:需要解决的问题是如何为对象(甚至是内置对象)制作一个序列化器。最好的方法不是做一个复杂的序列化器来处理内置对象,而是根据类型查找序列化器。

像这样:

def IntSerializer(theint):
    return str(theint)

def StringSerializer(thestring):
    return repr(thestring)

def MyOwnSerializer(value):
    return "whatever"

serializers = {
    int: IntSerializer,
    str: StringSerializer,
    mymodel.myclass: MyOwnSerializer,
}

def serialize(ob):
    try:
        return ob.serialize() #For objects that know they need to be serialized
    except AttributeError:
        # Look up the serializer amongst the serializer based on type.
        # Default to using "repr" (works for most builtins).
        return serializers.get(type(ob), repr)(ob)

这样你可以轻松添加新的序列化器,代码也容易维护和理解,因为每种类型都有自己的序列化器。注意到一些类型是内置的这一点变得完全不重要了。:)

33

这是个老问题,但似乎没有哪个答案真正解决了这个具体的问题:“(如何) 判断一个Python变量是否是内置类型的实例”。注意,这里说的不是“某个特定的内置类型”,而是“某种内置类型”。

判断一个对象是否是内置类型/类的实例,正确的方法是检查这个对象的类型是否在模块 __builtin__ 中定义。

def is_builtin_class_instance(obj):
    return obj.__class__.__module__ == '__builtin__'

注意:如果 obj 是一个类而不是实例,不管这个类是否是内置的,都会返回True,因为类本身也是一个对象,是 type 的实例(也就是说 AnyClass.__class__type)。

12

实现这个目标的最好方法是把类型收集到一个叫做 primitiveTypes 的元组列表里,然后:

if isinstance(myvar, primitiveTypes): ...

types 模块里包含了所有重要类型的集合,这些可以帮助你构建这个列表或元组。

这个方法从 Python 2.2 开始就可以用了

撰写回答