5

「isinstance() は有害と見なされます」を読んだところですが、妥当なようです。要するに、この関数の使用を避けることを主張しています。

さて、ちょうど今、ツリーとして構造化された入力を受け取り、ツリーの構造情報を必要とするプログラムを書いています。GUI を実装する時間がないので、ユーザーにそれを構成ファイルに書き込むように強制します (これが悪いインターフェイスであることはわかっていますが、スケジュールは非常にタイトです)。私のユーザーは非常に技術的ですが、必ずしも python を知っているわけではありません。入力ツリーを表すリストのリスト (リストのリストなど) をファイルに含めることを選択しました。最後の要素はツリーのリーフ ノードです。これは、ユーザーに辞書のシンタックスを押し付けるよりもはるかに優れていると思います。

次のようにリストを再帰的に解析する予定です (ツリーの構造の使用を省略し、単純化して、各リーフ ノードでtreatLeafNode() を呼び出す必要があるとしましょう)。

def parseTree(input):
    if isinstance (input, list):
        for item in input:
            parseTree(item)
    else:
        treatLeafNode(item)

記事に照らして、 isinstance() を使用せずにそれを再帰する簡単な方法があるかどうか疑問に思っています...

誰か知っていますか?

4

5 に答える 5

10

あなたの状況は、私が使用する状況の 1 つですisinstance。データ構造は十分に制約されており、リストと非リストを区別する必要があります。isinstanceリストかどうかを尋ねるために使用します。あなたは言いませんが、文字列はツリーの葉の中にあるかもしれないと思います。それらはリストと同じように反復可能であるため、ダックタイピングの方法でそれらを区別するのは面倒です。

于 2011-05-04T11:52:11.347 に答える
5

あなたが使用することができます

def parseTree(input):
    try:
        for item in input:
            parseTree(item)
    except TypeError:
        treatLeafNode(item)

ただし、これは文字列も反復することに注意してください。

于 2011-05-04T11:40:25.180 に答える
2

値と子のリストを保持できる Node オブジェクトを使用してツリー構造をカプセル化すると、よりうまくいく可能性があります。

class Node(object):
    def __init__(self, children=[], value=None):
        self.children = children
        self.value = value
    def isLeaf(self):
        return len(self.children) == 0

現在、ノードは明示的に値を持つリーフまたは子を持つ要素のいずれかです (技術的には、この例では非リーフ ノードも値を持つことができますが、非リーフ ノードが値を持たないようにすることをアプリケーション コードで選択できます)。parseTree次のように記述できます。

def parseTree(node):
    if node.isLeaf():
        treatLeafNode(node)
    else:
        for child in node.children:
            parseTree(child)

これはツリーの深さ優先検索であることに注意してください。

これをまとめるためのより良い方法があるかもしれませんparseTreeNode、これはアイデアを与えるはずです。もちろん、入力としてリストのリストであるPythonコードを記述し、それを上記のツリー構造に解析するようにユーザーに依頼しているという問題がまだありますisinstance. ユーザーが任意の Python コードを入力に挿入できないため、おそらく yaml が記述言語のより良い選択でしょうか?

于 2011-05-04T11:49:58.020 に答える
0

yamlを使ってみませんか?検証と解析ロジックも自分で行う必要はありません。

ツリーは次のようになります

- [[aMAN],[sTACK, OVER],[FLOW]]
- [[aMAN1],[sTACK1, OVER1],[FLOW1]]
- [[aMAN2],[sTACK2, OVER2],[FLOW2]]

解析するコード

import yaml                    
f= open('test.yml')
test = yaml.load(f.read())
print test

出力:

[[['aMAN'], ['sTACK', 'OVER'], ['FLOW']], [['aMAN1'], ['sTACK1', 'OVER1'], ['FLOW1']], [['aMAN2'], ['sTACK2', 'OVER2'], ['FLOW2']]]
于 2011-05-04T12:54:29.787 に答える
0

優先ツリー構造としてリストのリストを選択した理由はありますか?設定ファイルに書き込むためのより良い方法をたくさん考えることができます。エンコードしようとしていると仮定します。

a
|-- b
|   |-- c
|   |-- d
|   |   |-- e
|   |   `-- f
|   `-- g
|       `-- h
|-- i
`-- j
    `-- k

どうですか

a: b, i, j
b: c, d, g
d: e, f
g: h
j: k

これを非常に簡単に辞書に解析し、ツリーに結合することができます。実際、私ConfigParserはあなたのためにすでにそれをしていると思います。

または、どうですか:

a
----b
--------c
--------d
------------e
------------f
--------g
------------h
----i
----j
--------k
于 2011-05-04T13:08:57.187 に答える