有没有一种简单的方法来确定变量是列表、字典还是其他什么?
当前回答
确定Python对象的类型
使用类型确定对象的类型
>>> obj = object()
>>> type(obj)
<class 'object'>
虽然它有效,但避免使用__class__之类的双下划线属性-它们在语义上不是公共的,虽然在这种情况下可能不是,但内置函数通常具有更好的行为。
>>> obj.__class__ # avoid this!
<class 'object'>
类型检查
有没有一种简单的方法来确定变量是列表、字典还是其他什么?我得到了一个可能是这两种类型的对象,我需要能够分辨出其中的区别。
好吧,这是另一个问题,不要使用类型-用法:
def foo(obj):
"""given a string with items separated by spaces,
or a list or tuple,
do something sensible
"""
if isinstance(obj, str):
obj = str.split()
return _foo_handles_only_lists_or_tuples(obj)
这涵盖了这样一种情况,即您的用户可能正在通过子类化str来做一些聪明或明智的事情-根据Liskov Substitution的原理,您希望能够在不破坏代码的情况下使用子类实例-而isinstance支持这一点。
使用摘要
更好的是,您可以从集合或数字中查找特定的抽象基类:
from collections import Iterable
from numbers import Number
def bar(obj):
"""does something sensible with an iterable of numbers,
or just one number
"""
if isinstance(obj, Number): # make it a 1-tuple
obj = (obj,)
if not isinstance(obj, Iterable):
raise TypeError('obj must be either a number or iterable of numbers')
return _bar_sensible_with_iterable(obj)
或只是不显式键入检查
或者,也许最棒的是,使用duck类型,不要显式地检查代码类型。Duck类型支持Liskov替换,更优雅,更少冗长。
def baz(obj):
"""given an obj, a dict (or anything with an .items method)
do something sensible with each key-value pair
"""
for key, value in obj.items():
_baz_something_sensible(key, value)
结论
使用类型实际获取实例的类。使用isinstance显式检查实际的子类或注册的抽象。只要在有意义的地方避免类型检查。
其他回答
尝试一下可能会更像蟒蛇。。。除了块。这样,如果你有一个像列表一样嘎嘎作响的类,或者像格言一样嘎嘎作响,那么不管它的类型是什么,它都会表现得很好。
为了澄清,“区分”变量类型的首选方法是鸭子类型:只要变量响应的方法(和返回类型)是您的子例程所期望的,就要像您期望的那样对待它。例如,如果您有一个类用getattr和setattr重载括号运算符,但使用了一些有趣的内部方案,如果这正是它试图模仿的,那么它应该像一本字典一样。
类型(A)的另一个问题是类型(B)检查,如果A是B的子类,那么当您希望它是真的时,它的计算结果为假。如果一个对象是一个列表的子类,那么它应该像列表一样工作:检查另一个答案中显示的类型将防止这种情况发生。(然而,这一点是可行的)。
除了前面的答案之外,值得一提的是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的文档中看到。
小心使用isinstance
isinstance(True, bool)
True
>>> isinstance(True, int)
True
但类型
type(True) == bool
True
>>> type(True) == int
False
使用类型()
x='hello this is a string'
print(type(x))
输出
<class 'str'>
要仅提取str,请使用
x='this is a string'
print(type(x).__name__)#you can use__name__to find class
输出
str
如果使用类型(变量)__name__我们可以读
使用类型():
>>> a = []
>>> type(a)
<type 'list'>
>>> f = ()
>>> type(f)
<type 'tuple'>
推荐文章
- 有没有办法在python中做HTTP PUT
- “foo Is None”和“foo == None”之间有什么区别吗?
- 类没有对象成员
- Django模型“没有显式声明app_label”
- 熊猫能自动从CSV文件中读取日期吗?
- 在python中zip的逆函数是什么?
- 有效的方法应用多个过滤器的熊猫数据框架或系列
- 如何检索插入id后插入行在SQLite使用Python?
- 我如何在Django中添加一个CharField占位符?
- 如何在Python中获取当前执行文件的路径?
- 我如何得到“id”后插入到MySQL数据库与Python?
- super()失败,错误:TypeError "参数1必须是类型,而不是classobj"当父不继承对象
- Python内存泄漏
- 实现嵌套字典的最佳方法是什么?
- 如何在TypeScript中声明一个固定长度的数组