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

Проверьте, является ли вход списком/кортежем строк или одной строкой

У меня есть метод, в котором я хочу принять одну строку (путь, но не обязательно тот, который существует на машине, на которой запущен код) или список/кортеж строк.

Учитывая, что строки действуют как списки символов, как я могу определить, какой тип получил метод?

Я хотел бы иметь возможность принимать стандартные или unicode-строки для одной записи, а также списки или кортежи для нескольких, поэтому isinstance, похоже, не является ответом, если я не пропустил умный трюк с ним (например, используя общие классы предков?).

Версия Python - 2,5

4b9b3361

Ответ 1

Вы можете проверить, является ли переменная строкой или строкой unicode с

isinstance(some_object, basestring)

Это вернет True для строк и строк Unicode

Edit:

Вы можете сделать что-то вроде этого:

if isinstance(some_object, basestring):
    ...
elif all(isinstance(item, basestring) for item in some_object): # check iterable for stringness of all items. Will raise TypeError if some_object is not iterable
    ...
else:
    raise TypeError # or something along that line

Строгость, вероятно, не слова, но я надеюсь, что вы получите идею

Ответ 2

Проверка типов:

def func(arg):
    if not isinstance(arg, (list, tuple)):
        arg = [arg]
    # process

func('abc')
func(['abc', '123'])

с переменным числом аргументов:

def func(*arg):
    # process

func('abc')
func('abc', '123')
func(*['abc', '123'])

Ответ 3

isinstance - это вариант:

In [2]: isinstance("a", str)
Out[2]: True

In [3]: isinstance([], str)
Out[3]: False

In [4]: isinstance([], list)
Out[4]: True

In [5]: isinstance("", list)
Out[5]: False

Ответ 4

Как мне нравится держать вещи простыми, вот кратчайшая форма, которая совместима как с 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")

Ответ 5

Проверьте тип с isinstance (arg, basestring)

Ответ 6

>>> type('abc') is str
True
>>> type(['abc']) is str
False

Этот код совместим с Python 2 и 3

Ответ 7

Вы считали синтаксис varargs? Я не уверен, что это то, о чем вы просите, но что-то вроде этот вопрос будет вдоль ваших линий?

Ответ 8

Вы не можете сделать:

(i == list (i) or i == tuple (i))

Он ответил бы, если вход является кортежем или списком. Единственная проблема заключается в том, что он не работает должным образом с кортежем, содержащим только одну переменную.