没有isinstance()的列表列表的递归

Emi*_*har 5 python isinstance

我刚读过"isinstance()被认为是有害的",这似乎是合理的.简而言之,它主张避免使用这个功能.

好吧,刚才我正在编写一个程序,它将输入结构化为树,并且需要树的结构信息.没有时间实现GUI,我强加给用户将其写入配置文件(我知道这是一个糟糕的接口,但时间表非常紧张).我的用户非常技术,但不一定知道python.我选择该文件将包含表示输入树的列表(列表列表等)列表,最终元素是树的叶节点.我认为这比在用户上强加字典的合成更好.

我计划递归地解析列表如下(省略树的结构的使用,让我们简化并说必须在每个叶节点上调用treatLeafNode()):

def parseTree(input):
    if isinstance (input, list):
        for item in input:
            parseTree(item)
    else:
        treatLeafNode(item)
Run Code Online (Sandbox Code Playgroud)

根据这篇文章,我想知道是否有一种简单的方法来解决这个问题,而不使用isinstance()......

有人知道吗?

Ned*_*der 10

你的情况就是我要用的地方之一isinstance.您的数据结构受到很好的约束,您需要区分列表而不是列表.用isinstance问,如果它是一个列表.你没有说,但是我想象字符串可能在树的叶子中,并且它们可以像列表那样迭代,所以用鸭子打字的方式区分它们是很繁琐的.


Sve*_*ach 5

你可以用

def parseTree(input):
    try:
        for item in input:
            parseTree(item)
    except TypeError:
        treatLeafNode(item)
Run Code Online (Sandbox Code Playgroud)

请注意,这也会迭代字符串.