在遍历包含字符串和列表的列表时使用isinstance(x, list)
在处理嵌套列表的遍历这个讨论中,有人提到“类型检查在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
就像是一个权宜之计,当你的同事或者某个库的作者给你带来麻烦时,你需要用它来解决问题——否则尽量避免使用它。