Проверьте, является ли вход списком/кортежем строк или одной строкой
У меня есть метод, в котором я хочу принять одну строку (путь, но не обязательно тот, который существует на машине, на которой запущен код) или список/кортеж строк.
Учитывая, что строки действуют как списки символов, как я могу определить, какой тип получил метод?
Я хотел бы иметь возможность принимать стандартные или unicode-строки для одной записи, а также списки или кортежи для нескольких, поэтому isinstance, похоже, не является ответом, если я не пропустил умный трюк с ним (например, используя общие классы предков?).
Версия Python - 2,5
Ответы
Ответ 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))
Он ответил бы, если вход является кортежем или списком. Единственная проблема заключается в том, что он не работает должным образом с кортежем, содержащим только одну переменную.