检查输入是否是字符串的列表/元组或单个字符串

时间:2009-05-28 19:35:22

标签: python

我有一个方法,我希望能够接受单个字符串(路径,但不一定是运行代码的机器上存在的路径)或字符串列表/元组。

鉴于字符串充当字符列表,我怎么知道该方法收到了哪种?

我希望能够接受单个条目的标准字符串或unicode字符串,以及多个列表或元组,所以isinstance似乎不是答案,除非我错过了一个聪明的技巧(比如利用共同的祖先类?)。

Python版本为2.5

9 个答案:

答案 0 :(得分:57)

您可以使用

检查变量是字符串还是unicode字符串
isinstance(some_object, basestring)

这将为字符串和unicode字符串

返回True

编辑:

你可以这样做:

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

字符串可能不是一个字,但我希望你明白这个想法

答案 1 :(得分:15)

类型检查:

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

答案 2 :(得分:9)

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

答案 3 :(得分:6)

由于我喜欢简单易懂,这里是与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")

答案 4 :(得分:5)

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

此代码与Python 2和3兼容

答案 5 :(得分:3)

使用isinstance(arg,basestring)检查类型

答案 6 :(得分:1)

您是否考虑过varargs语法?我不确定这是不是你要问的问题,但this question会不会出现这样的问题?

答案 7 :(得分:0)

令我惊讶的是,没有人给出关于鸭子类型的答案,但是给出了不清楚或高度依赖类型或版本依赖的答案。另外,不幸的是,可接受的答案为Python 2和3提供了单独的代码。Python使用并鼓励使用鸭子输入,因此(比sorin的“最短形式”(不是鸭子输入)多一行),我建议:

def is_str(v):
    return hasattr(v, 'lower')

...以及您要使用的任何其他属性(记住引号)。这样,使用您的软件的客户端代码可以发送他们想要的任何类型的字符串,只要它具有您的软件所需的接口即可。鸭子输入法对于其他类型更有用,但通常是最好的方法。

或者您也可以这样做(或者通常检查AttributeError并采取其他措施):

def is_str(v):
    try:
        vL = v.lower()
    except AttributeError:
        return False
    return True

答案 8 :(得分:-2)

你做不到:

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

如果输入是元组或列表,它将回复。唯一的问题是它不能正确处理仅包含一个变量的元组。