我如何确定一个“变量”是否是内置的,比如字符串、列表、字典或数字,而不是“对象”。我正在尝试编写一个类似于deepcopy的函数,用于复制字典中的内置类型,但忽略对象。
所有东西都是一个对象。如果你想确定某个对象是字符串、整数或其他类型,使用isinstance()
函数:
>>> isinstance("hello!", str)
True
>>> isinstance("hello!", int)
False
>>> mylist = [3, "cabbage", 5.43, {'cat':'dog'}, {'horse':'elephant'}, ['another', 'list']]
>>> for i in mylist:
... if isinstance(i, dict):
... dostuff()
由于内置类型很少,您可以使用 if 进行检查:
if type(a)==int or type(a)==float or type(a)==str or type(a)==list or type(a)==dict:
#do something
isinstance()
函数。if isinstance(a,(int,float,str,list,dict,set)):
#do something
我不确定这是否是正确的方法,但这是检查给定变量是否为任何内置数据类型实例的方法之一。
isinstance()
更简洁 :) - TerryAif any(isinstance(a, t) for t in (int, float, str, list, ...)
更符合 Python 风格... - glglglisinstance
函数也可以接受元组作为第二个参数,因此 isinstance(a, (int, float, ...))
也可以正常工作。 - Volatility我认为使用class.__module__
属性是最好的选择,它保存了定义该类的模块名称:
>>> import __builtin__
>>> int.__module__ == __builtin__.__name__
True
>>> class A: pass
...
>>> A.__module__
'__main__'
def is_builtin(obj): return type(obj).__module__ == __builtin__.__name__
- icecrime首先,一切皆为对象,所以我想你想要测试内置类型与用户定义类型之间的区别。
选择要排除的内置类型,并比较变量的type()。
if type(yourvar) in [list,set,int,float,str,dict]:
print "builtin"
else:
print "object"
>>> class A(list):
pass
>>> a = A()
>>> isinstance(a,list)
True
仅限于CPython(也可能适用于其他实现):
import __builtin__
builtin_types = [x for x in __builtin__.__dict__.values() if isinstance(x, type)]
def is_builtin_type(x):
for t in builtin_types:
if isinstance(x, t):
return True
这包括内置的异常、字节数组、对象和其他一些东西,其他答案中的人没有提到 :-)
首先,在Python中,类和类型之间没有区别:
>>> type("234"), "234".__class__
(str, str)
测试一个对象类型可以具有两个不同的含义:
isinstance
测试您的对象是否为给定类型或子类型:
>>> class mystr(str): pass
>>> s = mystr(4)
>>> s
'4'
>>> ype(s)
__main__.mystr
>>> isinstance(s, str)
True
而
>>> type(s) is str
False
>>> type(s)
<class '__main__.mystr'>
type(s) == str
,而是type(s) is str
。__builtin__
。>>> str.__module__
'__builtin__'
>>> mystr.__module__
'__main__'
所以你可能可以写
>>> def is_of_builtin_type(obj):
return type(obj).__module__ == '__builtin__'
>>> is_of_builtin_type("4223")
True
>>> class mystr(str): pass
>>> is_of_builtin_type(mystr(223))
False
顺便说一下,我采用了这个解决方案:(受this启发)
from six import integer_types, string_types, text_type
_copyable_types = (
integer_types,
string_types,
text_type,
list,
dict,
set,
)
def deepish_copy(org):
'''
Will copy a dict but ignore user objects at top level.
'''
out = {}
for k, v in org.iteritems():
if isinstance(v, _copyable_types):
try:
out[k] = v.copy() # dicts, sets
except AttributeError:
try:
out[k] = v[:] # lists, tuples, strings, unicode
except TypeError:
out[k] = v # ints
return out
简单明了
对于给定的变量var
,使用函数isinstance(var, type)
,如果var
是类型type
,则返回True
,否则返回False
。你可以在解释器中轻松地检查它:
>>> a = 2
>>> isinstance(a, int)
True
>>> b = 'correct'
>>> isinstance(b, int)
False
>>> c = [1,2,3,4]
>>> isinstance(c, list)
True
......等等。因此,如果您想检查item
是否为dict
:
if isinstance(item, dict):
# handle the dict, do your deep copy
else:
# meh, whatever
或者
考虑使用类型模块,它允许:
from types import DictType
def dictate(item):
if isinstance(item, dict):
# handle the dict
else:
# panic!
type(var)
是一个糟糕的想法,它不允许子类化。 - Gareth Latty
type(object)
。 - icedwaterJSONEncoder
子类,忽略掉任何不能正常处理的内容呢? - Gareth Latty