Проверьте, является ли input списком / кортежем строк или одной строкой - PullRequest
46 голосов
/ 28 мая 2009

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

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

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

Python версия 2.5

Ответы [ 8 ]

58 голосов
/ 28 мая 2009

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

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

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

15 голосов
/ 28 мая 2009

Тип проверки:

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'])
9 голосов
/ 28 мая 2009

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
6 голосов
/ 07 ноября 2014

Поскольку я хотел бы упростить ситуацию, вот самая короткая форма, которая совместима с 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 голосов
/ 17 мая 2017
>>> type('abc') is str
True
>>> type(['abc']) is str
False

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

3 голосов
/ 28 мая 2009

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

1 голос
/ 28 мая 2009

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

0 голосов
/ 14 октября 2016

Разве вы не можете сделать:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...