1

次のコードがあります

def printmylist( mylist ):
    """
    print tree
    """
    try:
    for f in mylist:
        printmylist( f )
    except:
        print( "        " + mylist )

次のような出力を得たいと思っています:

root
   branch
     leaf
     leaf

しかし、文字列は列挙可能であるため、取得します

r
o
o
t
.
.

型のチェックは非 Pythonic のように見えるので、Pythonian はどのようにこれを行うのでしょうか?

4

3 に答える 3

5

私が知っている最もクリーンな方法は、使用することですtypes.StringTypes(と混同しないでくださいtypes.StringType):

isinstance(var, types.StringTypes)

または:

isinstance(var, basestring)

モジュールのドキュメントはtypes、後者が Python 2.x の最近のバージョンで推奨される方法であることを示しています。

于 2011-09-21T12:16:50.447 に答える
1

この問題には、次の Pythonic アプローチを使用します。isinstance()電話は不要です。したがって、Python でラップしたさまざまなカスタム C++ 文字列クラスでも動作します。これらの isinstance() ベースのメソッドは、そのような場合には機能しないと思います。さらに、OPは、型チェックを含まないソリューションを明示的に要求しました。Pythonistas は、型ではなく動作をチェックします。

ここでの秘訣は、文字列には通常とは異なる特性があるという観察に関係しています。つまり、1 文字の文字列の最初の要素は、同じ 1 文字の文字列です。

"f"[0] == "f"

これは python 2.x で動作します:

def is_string(s):
    try:
        if (s[0] == s[0][0]):
            return True
    except:
        pass
    return False
于 2011-09-21T12:42:35.670 に答える
-1

最も単純なものはif type(f) == str

場合によっては、例外よりも if を使用した方がよい場合があります。

編集: larsmans のコメントにより、このオプションはお勧めしません。単純な使い方では便利ですが、プロのコーディングではisinstance.

于 2011-09-21T12:17:20.723 に答える