确定Python变量是否是内置类型的实例

Ale*_*nov 21 python variables instance

我需要确定给定的Python变量是原生类型的实例:str,int,float,bool,list,dict等.这样做有优雅的方式吗?

或者这是唯一的方法:

if myvar in (str, int, float, bool):
    # do something
Run Code Online (Sandbox Code Playgroud)

Aar*_*lla 15

实现此目的的最佳方法是在名为的元组列表中收集类型,primitiveTypes并且:

if isinstance(myvar, primitiveTypes): ...
Run Code Online (Sandbox Code Playgroud)

types模块包含所有重要类型的集合,可以帮助构建列表/元组.

从Python 2.2开始工作

  • 请注意,`types` 模块*没有*真正提供完整的类型列表。例如,那里没有 `int`。但是,有提供大多数内置函数的`buildins` 模块,因此可以执行`builtin_types = tuple(getattr(builtins, t) for t in dir(builtins) if isinstance(getattr(builtins, t), type))`然后使用`isinstance(value, builtin_types)`。 (3认同)
  • 使用'types'中的类型与直接使用更简单的名称(int,str,float,...)没有什么不同! (2认同)

gla*_*ain 10

这是一个老问题,但似乎没有一个答案实际上回答了具体问题:"(操作方法)确定Python变量是否是内置类型的实例".请注意,它不是"[...] 特定/给定的内置类型",而是a.

确定给定对象是否为内置类型/类的实例的正确方法是检查对象的类型是否恰好在模块中定义__builtin__.

def is_builtin_class_instance(obj):
    return obj.__class__.__module__ == '__builtin__'
Run Code Online (Sandbox Code Playgroud)

警告:如果obj是一类,而不是一个实例,没有如果类是内置或没有的事,返回True因为一个类也是一个对象,实例type(即AnyClass.__class__type).

  • 在 Python 3.7 中,该模块称为“builtins” (10认同)
  • 在 Python3 中,该模块称为“__builtins__”。 (3认同)

Len*_*bro 8

不是我知道你为什么要这样做,因为Python中没有任何"简单"类型,它是所有对象.但这有效:

type(theobject).__name__ in dir(__builtins__)
Run Code Online (Sandbox Code Playgroud)

但明确列出类型可能更好,因为它更清楚.甚至更好:更改应用程序,这样您就不需要知道差异了.

更新:需要解决的问题是如何为对象创建序列化程序,甚至是内置的对象.实现这一目标的最佳方法不是制作一个以不同方式处理内置的大型phat序列化程序,而是根据类型查找序列化程序.

像这样的东西:

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)
Run Code Online (Sandbox Code Playgroud)

这样您就可以轻松添加新的序列化程序,并且代码易于维护和清除,因为每种类型都有自己的序列化程序.注意一些类型内置的事实是如何完全无关紧要的.:)


S.L*_*ott 7

您似乎对确保simplejson将处理您的类型感兴趣.这很简单

try:
    json.dumps( object )
except TypeError:
    print "Can't convert", object
Run Code Online (Sandbox Code Playgroud)

哪个比猜测JSON实现处理哪些类型更可靠.