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