Подтвердить что ты не робот

Что такое питонический способ дифференцирования строки и списка?

В моей программе у меня много мест, где объектом может быть строка или список, содержащий строки и другие подобные списки. Обычно они считываются из файла JSON. Оба они должны рассматриваться по-разному. Прямо сейчас, я просто использую isinstance, но это не похоже на самый питонический способ сделать это, так и у кого-то есть лучший способ сделать это?

4b9b3361

Ответ 1

Не нужно импортировать модули, isinstance(), str и unicode (версии до 3 - там нет unicode в 3!) выполнит эту работу для вас.

Python 2.x:

Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> isinstance(u'', (str, unicode))
True
>>> isinstance('', (str, unicode))
True
>>> isinstance([], (str, unicode))
False

>>> for value in ('snowman', u'☃ ', ['snowman', u'☃ ']):
...     print type(value)
... 
<type 'str'>
<type 'unicode'>
<type 'list'>

Python 3.x:

Python 3.2 (r32:88445, May 29 2011, 08:00:24) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> isinstance('☃ ', str)
True
>>> isinstance([], str)
False

>>> for value in ('snowman', '☃ ', ['snowman', '☃ ']):
...     print(type(value))
... 
<class 'str'>
<class 'str'>
<class 'list'>

От PEP008:

Сравнение типов объектов всегда должно использовать isinstance() вместо сравнения типов напрямую.

Ответ 2

Поскольку у Python3 больше нет unicode или basestring, в этом случае (где вы ожидаете либо список, либо строку) лучше протестировать с list

if isinstance(thing, list):
    # treat as list
else:
    # treat as str/unicode

поскольку он совместим как с Python2, так и с Python3

Ответ 3

Использование isinstance:

В Python >= 2.3 строка может быть типом str или unicode. Чтобы проверить оба случая:

if isinstance(a,basestring): # same as isinstance(obj, (str, unicode))
   print "Object is a string"

Из Python 3 существует только один тип строки, поэтому вместо basestring вы должны использовать str:

if isinstance(a,str):
   print "Object is a string"

Ответ 4

Другой метод, использующий практику "Лучше попросить прощения, чем разрешение", типичная настройка утиных предпочтений в Python, вы можете попытаться сделать то, что хотите, например:

try:
    value = v.split(',')[0]
except AttributeError:  # 'list' objects have no split() method
    value = v[0]

Ответ 5

Как мне нравится держать вещи простыми, вот кратчайшая форма, которая совместима как с 2.x, так и 3.x:

# trick for py2/3 compatibility
if 'basestring' not in globals():
   basestring = str

v = "xx"

if isinstance(v, basestring):
   print("is string")

Ответ 6

Вы можете использовать модуль типов:

import types
if type(ls) == types.ListType:
    #your code for list objects here