在遍历包含字符串和列表的列表时使用isinstance(x, list)

4 投票
1 回答
8027 浏览
提问于 2025-04-17 16:23

处理嵌套列表的遍历这个讨论中,有人提到“类型检查在Python中并不优雅”。一般来说,这句话是对的:我们更希望关注接口(也就是鸭子类型),而不是具体的类型。

这个问题提到的嵌套列表的形式是['a', ['c', ['e'], 'd'], 'b'],而我们特别把字符串视为原子类型(不可迭代的)。所以,我们不能简单地使用collections.Iterable,但另一方面,使用isinstance(x, list)似乎又有点不太妥当。

我的回答是

def traverse(l):
    for x in l:
        if isinstance(x, list):
            traverse(x)
    callback(l)

那么,有什么更好的方法吗?或者在这里使用isinstance可以吗?

1 个回答

7

我觉得你的回答挺不错的,不过我可能会把它改成

if not isinstance(x,basestring):
   ...

这样会更能接受不同的输入。最终,有些问题确实需要用到 isinstance,这也是它在语言中存在的原因。

不过,关于这个问题,有一点不太符合 Python 的风格,那就是数据结构。在 Python 中,如果一个问题看起来特别难,可能是因为你存储数据的方式不对……(当然,我知道你对提问者的数据结构没有控制权;-)。

总的来说,我的看法是,isinstance 就像是一个权宜之计,当你的同事或者某个库的作者给你带来麻烦时,你需要用它来解决问题——否则尽量避免使用它。

撰写回答