什么是检查Python变量类型的最佳(惯用)方法?

76 浏览
0 Comments

什么是检查Python变量类型的最佳(惯用)方法?

这个问题已经有了答案

type() 和 isinstance() 有什么区别?

我需要知道 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() 函数?

admin 更改状态以发布 2023年5月24日
0
0 Comments

type(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

0
0 Comments

假如有人将一个unicode字符串或一个派生自dict的类或实现dict的类传递给你的函数,会发生什么?以下代码覆盖了前两种情况。如果你使用的是Python 2.6,你可能想使用 collections.Mapping 来替代 dict,正如 ABC PEP 所述。 \n

def value_list(x):
    if isinstance(x, dict):
        return list(set(x.values()))
    elif isinstance(x, basestring):
        return [x]
    else:
        return None

0