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

nne*_*neo 5 python collections iterable

Iterating嵌套列表里面,我被告知"类型检查不是Pythonic".通常,这是真的:我们只想查看接口(duck-typing)而不是特定类型.

关于表单嵌套列表的问题['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)
Run Code Online (Sandbox Code Playgroud)

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

mgi*_*son 7

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

if not isinstance(x,basestring):
   ...
Run Code Online (Sandbox Code Playgroud)

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

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

基本上,我想这我的看法是,isinstance黑客,你需要做柠檬水当你的同事/库的一些作家的地方给你柠檬-否则,你尽可能避免使用.