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模块包含所有重要类型的集合,可以帮助构建列表/元组.
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中没有任何"简单"类型,它是所有对象.但这有效:
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)
这样您就可以轻松添加新的序列化程序,并且代码易于维护和清除,因为每种类型都有自己的序列化程序.注意一些类型内置的事实是如何完全无关紧要的.:)
您似乎对确保simplejson将处理您的类型感兴趣.这很简单
try:
json.dumps( object )
except TypeError:
print "Can't convert", object
Run Code Online (Sandbox Code Playgroud)
哪个比猜测JSON实现处理哪些类型更可靠.