什么是检查Python变量类型的最佳(惯用)方法?
什么是检查Python变量类型的最佳(惯用)方法?
这个问题已经有了答案:
我需要知道 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日
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
假如有人将一个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