我需要知道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提醒我,使用dict(作为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()函数?
Type (dict())表示“创建一个新的dict,然后找出它的类型”。直接说dict会更快。
但如果你只是想检查类型,更习惯的方法是isinstance(x, dict)。
注意,isinstance也包括子类(感谢Dustin):
class D(dict):
pass
d = D()
print("type(d) is dict", type(d) is dict) # -> False
print("isinstance (d, dict)", isinstance(d, dict)) # -> True
我觉得还是去做比较好
if isinstance(x, str):
do_something_with_a_string(x)
elif isinstance(x, dict):
do_somethting_with_a_dict(x)
else:
raise ValueError
另一种形式,取决于你的代码,一种或另一种甚至可能被认为是更好的。一是三思而后行
try:
one, two = tupleOrValue
except TypeError:
one = tupleOrValue
two = None
另一种方法来自Guido,它是函数重载的一种形式,使您的代码更加开放。
http://www.artima.com/weblogs/viewpost.jsp?thread=155514
这应该可以工作-所以,不,您的代码没有任何问题。然而,它也可以用dict来完成:
{type(str()): do_something_with_a_string,
type(dict()): do_something_with_a_dict}.get(type(x), errorhandler)()
更简洁,更精辟,你说呢?
编辑. .听从了Avisser的建议,代码也是这样工作的,而且看起来更好:
{str: do_something_with_a_string,
dict: do_something_with_a_dict}.get(type(x), errorhandler)()