1

我有以下代码

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

希望得到如下输出:

root
   branch
     leaf
     leaf

但由于字符串是可枚举的,我得到

r
o
o
t
.
.

检查类型似乎是 unpythonic,那么 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 检查行为,而不是类型。

这里的诀窍在于观察字符串具有不寻常的属性:单字符字符串的第一个元素是相同的单字符字符串。

"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 回答