有没有一种简单的方法来确定变量是列表、字典还是其他什么?
当前回答
type()是比isinstance()更好的解决方案,尤其是对于布尔值:
True和False只是python中表示1和0的关键字。因此
isinstance(True, int)
and
isinstance(False, int)
两者都返回True。两个布尔值都是整数的实例。然而,type()更聪明:
type(True) == int
返回False。
其他回答
小心使用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__我们可以读
value = 12
print(type(value)) # will return <class 'int'> (means integer)
或者你可以这样做
value = 12
print(type(value) == int) # will return true
尝试一下可能会更像蟒蛇。。。除了块。这样,如果你有一个像列表一样嘎嘎作响的类,或者像格言一样嘎嘎作响,那么不管它的类型是什么,它都会表现得很好。
为了澄清,“区分”变量类型的首选方法是鸭子类型:只要变量响应的方法(和返回类型)是您的子例程所期望的,就要像您期望的那样对待它。例如,如果您有一个类用getattr和setattr重载括号运算符,但使用了一些有趣的内部方案,如果这正是它试图模仿的,那么它应该像一本字典一样。
类型(A)的另一个问题是类型(B)检查,如果A是B的子类,那么当您希望它是真的时,它的计算结果为假。如果一个对象是一个列表的子类,那么它应该像列表一样工作:检查另一个答案中显示的类型将防止这种情况发生。(然而,这一点是可行的)。
在许多实际情况下,您也可以使用@functools.singledispatch来定义泛型函数(由多个函数组成的函数,对不同类型执行相同的操作),而不是使用类型或isinstance。
换句话说,当您有如下代码时,您可能希望使用它:
def do_something(arg):
if isinstance(arg, int):
... # some code specific to processing integers
if isinstance(arg, str):
... # some code specific to processing strings
if isinstance(arg, list):
... # some code specific to processing lists
... # etc
下面是一个工作原理的小示例:
from functools import singledispatch
@singledispatch
def say_type(arg):
raise NotImplementedError(f"I don't work with {type(arg)}")
@say_type.register
def _(arg: int):
print(f"{arg} is an integer")
@say_type.register
def _(arg: bool):
print(f"{arg} is a boolean")
>>> say_type(0)
0 is an integer
>>> say_type(False)
False is a boolean
>>> say_type(dict())
# long error traceback ending with:
NotImplementedError: I don't work with <class 'dict'>
此外,我们可以使用抽象类同时覆盖几种类型:
from collections.abc import Sequence
@say_type.register
def _(arg: Sequence):
print(f"{arg} is a sequence!")
>>> say_type([0, 1, 2])
[0, 1, 2] is a sequence!
>>> say_type((1, 2, 3))
(1, 2, 3) is a sequence!
推荐文章
- IEEE 754浮点数不能精确表示的第一个整数是哪一个?
- 在每个列表元素上调用int()函数?
- 当使用代码存储库时,如何引用资源的相对路径
- c++中size_t和int的区别是什么?
- 如何在Flask-SQLAlchemy中按id删除记录
- 在Python中插入列表的第一个位置
- Python Pandas只合并某些列
- 如何在一行中连接两个集而不使用“|”
- 从字符串中移除前缀
- 代码结束时发出警报
- 如何在Python中按字母顺序排序字符串中的字母
- 在matplotlib中将y轴标签添加到次要y轴
- 如何消除数独方块的凹凸缺陷?
- 为什么出现这个UnboundLocalError(闭包)?
- 使用Python请求的异步请求