【发布时间】:2010-09-27 14:15:36
【问题描述】:
我需要知道 Python 中的变量是字符串还是字典。下面的代码有什么问题吗?
if type(x) == type(str()):
do_something_with_a_string(x)
elif type(x) == type(dict()):
do_somethting_with_a_dict(x)
else:
raise ValueError
更新:我接受了 avisser 的回答(尽管如果有人解释为什么 isinstance 比 type(x) is 更受欢迎,我会改变主意)。
但感谢裸狂热者提醒我,使用 dict(作为案例陈述)通常比使用 if/elif/else 系列更干净。
让我详细说明我的用例。如果一个变量是一个字符串,我需要把它放在一个列表中。如果它是一个字典,我需要一个唯一值列表。这是我想出的:
def value_list(x):
cases = {str: lambda t: [t],
dict: lambda t: list(set(t.values()))}
try:
return cases[type(x)](x)
except KeyError:
return None
如果首选isinstance,你会如何编写这个value_list()函数?
【问题讨论】:
-
恕我直言,isinstance() 更好,因为您可以针对某个类类型测试某个变量的类型,而无需分配/创建任何东西。我的意思是:当您执行
type(str())时,您正在创建一个 str 对象的实例,只是为了获取它的类型。刚刚创建的对象随后被丢弃并随后被垃圾收集。你不需要这样的东西,因为你要测试的类型是预先知道的,所以如果你这样做isinstance(variable, type),效率会更高。 -
@RichardGomes 实际上,您混淆了两个不同的主题。如果目标是避免分配
str,那么编码人员应该简单地说str而不是type(str())。假设编码器的意思是他们所说的,即测试 EXACT 类型。isinstance的重点是允许子类型。可能需要也可能不需要。例如。 collections.OrderedDict 是 dict 的子类,所以如果编码人员也想允许这些,那么将代码从type(x) == dict更改为isinstance(x, dict)是正确的。不是为了避免分配,而是为了将含义更改为“可以接受子类”。 -
分配空的东西并用
type()检查是不合适的,不仅因为无用的对象的实例,甚至因为你不能检查,例如,如果你的对象是file而不创建文件系统上的文件(type(file())失败,因为file()至少需要一个参数)
标签: python types typechecking