【问题标题】:Check if variable is either a couple types? (str or list)检查变量是否是几种类型? (字符串或列表)
【发布时间】:2015-11-03 00:23:18
【问题描述】:

我知道我是否要检查例如变量 x 是否为 str 我会做

if type(x) is str:

但是如何检查 x 是字符串还是列表?所以我可以在不添加另一个 if 分支的情况下做到这一点

if type(x) is (str, list):
     pass
else:
     raise SomeError

【问题讨论】:

    标签: python if-statement types boolean


    【解决方案1】:
    type(x) in (str, list)
    

    isinstance(x, (str, list))
    

    两者在语义上并不相同。阅读文档中的isinstance() 函数。

    【讨论】:

    • isinstance() 通常是首选(但并非总是如此)。
    • 对,取决于你想要的语义。 :) 但大多数时候你想要isinstance()
    【解决方案2】:
    if isinstance(x, list) or isinstance(x, list):
    

    或者对于许多不同的类型

    if any(isinstance(x, i) for i in [list, tuple, string]):
    

    或者如果你想看看它是否是任何类型的可迭代

    if hasattr(x, '__iter__'):
    

    【讨论】:

    • 我认为 isinstance(x, collections.Iterable)hasattr(x, '__iter__') 更 Pythonic。 -- 你可以将一个元组作为第二个参数传递给isinstance()
    • @NiklasR 它们并不完全相同。如果我创建一个像class Test(object): def __iter__(self): return [] 这样的愚蠢类,hasattr(Test, '__iter__') 将返回 True,isinstance(x, collections.Iterable) 将返回 False。取决于您希望如何处理格式错误的类,例如我的 Test 类。
    • @NightShadeQueen 我无法确认这种行为,对我来说 isinstance(Test(), collections.Iterable) 返回 True。 ideone.com/YbEbzA
    【解决方案3】:

    使用类似下面的in关键字:

    if type(x) in (str, list):
    

    或者使用isinstance内置函数:

    if isinstance(x, (str, list)):
    

    【讨论】:

      猜你喜欢
      • 2016-12-19
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 2011-06-18
      • 2020-07-17
      • 1970-01-01
      • 2014-09-19
      • 1970-01-01
      相关资源
      最近更新 更多