我需要知道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
更好,我会改变我的想法)。但感谢nakedfanatic提醒我,使用字典(作为case语句)往往比使用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()函数?
str
,那么程序员应该简单地使用str
而不是type(str())
。假设程序员的意图是测试一个确切的类型。isinstance
的目的是允许子类型。这可能是所期望的,也可能不是。例如,collections.OrderedDict
是dict
的子类,因此,如果程序员也想允许这些类型,则将代码从type(x) == dict
更改为isinstance(x, dict)
是正确的。但不是为了避免分配,而是为了改变意义为“接受子类”。 - ToolmakerStevetype()
进行检查不仅是因为空对象实例无用,而且甚至因为你无法检查你的对象是否为file
类型而不在文件系统上创建文件(type(file())
失败,因为file()
需要至少一个参数)。 - dappiu