判断Python变量是否为内置类型的实例
我想知道一个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
模块里包含了所有重要类型的集合,这些可以帮助你构建这个列表或元组。