有没有一种简单的方法来确定变量是列表、字典还是其他什么?
当前回答
value = 12
print(type(value)) # will return <class 'int'> (means integer)
或者你可以这样做
value = 12
print(type(value) == int) # will return true
其他回答
可以使用type()或isinstance()。
>>> type([]) is list
True
请注意,通过在当前作用域中分配同名变量,可以删除列表或任何其他类型。
>>> the_d = {}
>>> t = lambda x: "aight" if type(x) is dict else "NOPE"
>>> t(the_d) 'aight'
>>> dict = "dude."
>>> t(the_d) 'NOPE'
上面我们看到dict被重新分配给一个字符串,因此测试:
type({}) is dict
…失败。
要解决此问题并更谨慎地使用type():
>>> import __builtin__
>>> the_d = {}
>>> type({}) is dict
True
>>> dict =""
>>> type({}) is dict
False
>>> type({}) is __builtin__.dict
True
通常,您可以从具有类名的对象中提取字符串,
str_class = object.__class__.__name__
并将其用于比较,
if str_class == 'dict':
# blablabla..
elif str_class == 'customclass':
# blebleble..
尝试一下可能会更像蟒蛇。。。除了块。这样,如果你有一个像列表一样嘎嘎作响的类,或者像格言一样嘎嘎作响,那么不管它的类型是什么,它都会表现得很好。
为了澄清,“区分”变量类型的首选方法是鸭子类型:只要变量响应的方法(和返回类型)是您的子例程所期望的,就要像您期望的那样对待它。例如,如果您有一个类用getattr和setattr重载括号运算符,但使用了一些有趣的内部方案,如果这正是它试图模仿的,那么它应该像一本字典一样。
类型(A)的另一个问题是类型(B)检查,如果A是B的子类,那么当您希望它是真的时,它的计算结果为假。如果一个对象是一个列表的子类,那么它应该像列表一样工作:检查另一个答案中显示的类型将防止这种情况发生。(然而,这一点是可行的)。
使用类型():
>>> a = []
>>> type(a)
<type 'list'>
>>> f = ()
>>> type(f)
<type 'tuple'>
除了前面的答案之外,值得一提的是collections.abc的存在,它包含几个补充duck类型的抽象基类(abc)。
例如,不必显式检查某项内容是否为列表,而是:
isinstance(my_obj, list)
如果您只想查看所拥有的对象是否允许获取项目,可以使用collections.abc.Sequence:
from collections.abc import Sequence
isinstance(my_obj, Sequence)
如果您对允许获取、设置和删除项目(即可变序列)的对象非常感兴趣,那么您可以选择collections.abc.MutableSequence。
这里还定义了许多其他ABC,可以用作映射的对象的映射、Iterable、Callable等。所有这些的完整列表可以在collections.abc的文档中看到。
推荐文章
- Numpy Max vs amax vs maximum
- 我应该在.gitignore文件中添加Django迁移文件吗?
- 每n行有熊猫
- 实例属性attribute_name定义在__init__之外
- 如何获取在Python中捕获的异常的名称?
- 第一次出现的值大于现有值的Numpy
- 如何从Python函数中返回两个值?
- 前一个月的Python日期
- Python中方括号括起来的列表和圆括号括起来的列表有什么区别?
- Python日志记录不输出任何东西
- 每n秒运行特定代码
- SQLAlchemy是否有与Django的get_or_create等价的函数?
- 如何将python datetime转换为字符串,具有可读格式的日期?
- 美丽的汤和提取div及其内容的ID
- 在Python中重置生成器对象