2009-05-28 5 views
32

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

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

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

Python версии 2,5

+2

ввода пробы/вывода делает такие вопросы гораздо легче интерпретировать –

+0

Вот простой ответ http://stackoverflow.com/a/26797718/99834 - не очевидна из-за изменений py2-3. – sorin

ответ

44

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

isinstance(some_object, basestring) 

Это вернет True для обеих строк и юникод строк

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 

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

+0

Aha! Я думал, что там какая-то общая родословная, я просто не мог найти ссылку ... – mavnn

1

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

+0

Разве это не просто заставило вызывающего абонента указать, что было отправлено? Я бы предпочел избежать этого, если это возможно. (И я также заинтригован относительно того, что я хочу сделать, это элегантным способом ...) – mavnn

3

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

11
проверка

Тип:

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']) 
5

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 
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") 
-1

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

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

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

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

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

Смежные вопросы