5

ネストされたリストを裏返しに繰り返すときに、「型チェックはPythonicではない」と言われました。一般的に、これは真実です。特定のタイプではなく、インターフェース(ダックタイピング)のみを調べたいのです。

質問はフォームのネストされたリストについて尋ねます['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ここで大丈夫ですか?

4

1 に答える 1

7

ここであなたの答えは大丈夫だと思います-私はそれをに変更するかもしれませんが

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

予想される入力に応じて、もう少し受け入れやすくします。最終的に、あなたが必要isinstanceとするいくつかの問題は、それがまだ言語に存在する理由です。

そうは言っても、この問題について非Python的であるのは、データ構造です。Pythonでは、問題が非常に難しいと思われる場合は、データを間違った方法で保存している可能性があります...(もちろん、他の質問のデータ構造の元のポスターが何であるかを制御できなかったことに気づきました。 -)。

基本的に、私の見解はisinstance、同僚/どこかの図書館の作家があなたにレモンを与えるときにレモネードを作るために必要なハックだと思います-そうでなければ、可能な限りそれを避けます。

于 2013-02-19T16:00:03.513 に答える