迭代包含字符串和列表的列表时的isinstance(x,list)

时间:2013-02-19 15:52:09

标签: python collections iterable

Iterating nested list inside-out,我被告知“类型检查不是Pythonic”。通常,这是真的:我们只想查看接口(鸭子类型)而不是特定类型。

问题是关于['a', ['c', ['e'], 'd'], 'b']形式的嵌套列表,我们特别考虑字符串原子(不可迭代)。所以,我们不能使用毯子collections.Iterable,但另一方面isinstance(x, list)确实看起来有点hacky。

我的回答是

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

什么是更好的方法?或isinstance好吗?

1 个答案:

答案 0 :(得分:7)

我认为你的答案是可以的 - 虽然我可能会改为

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

根据预期的输入使其更加接受。最终,您需要isinstance的一些问题,这就是它仍然存在于语言中的原因。

话虽这么说,关于这个非pythonic问题的是数据结构。在python中,如果问题看起来真的很难,那可能意味着你以错误的方式存储数据......(当然,我意识到你无法控制另一个问题的数据结构的原始海报是什么; - 。)

基本上,我认为我的观点是isinstance hack ,当你的同事/某个图书馆作家在某处给你柠檬时你需要制作柠檬水 - 否则你会避免它在可能的情况下。