Python: просмотр списка строк - как определить разницу? - PullRequest
1 голос
/ 21 сентября 2011

У меня есть следующий код

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

в надежде получить вывод вроде:

root
   branch
     leaf
     leaf

, но так как строка перечислима, я получаю

r
o
o
t
.
.

Проверка на тип, кажется, не пифонична, так как бы Pythonian поступил так?

Ответы [ 3 ]

5 голосов
/ 21 сентября 2011

Самый чистый способ, который я знаю, это использовать types.StringTypes (не путать с types.StringType):

isinstance(var, types.StringTypes)

В качестве альтернативы:

isinstance(var, basestring)

Документация для модуля types указывает, что последний вариант предпочтителен в последних версиях Python 2.x.

1 голос
/ 21 сентября 2011

Я использую следующий питонический подход к этой проблеме.isinstance() звонки не требуются.Поэтому он даже работает с различными пользовательскими классами строк C ++, которые я обернул в python.Я не думаю, что эти методы на основе 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
0 голосов
/ 21 сентября 2011

Самым простым является if type(f) == str

Иногда лучше использовать if, чем исключения.

РЕДАКТИРОВАТЬ: Из-за комментариев larsmans, я не рекомендую эту опцию.Это полезно при простом использовании, но в профессиональном кодировании лучше использовать isinstance.

...