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

mav*_*vnn 51 python

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

鉴于字符串充当字符列表,我如何判断该方法收到了哪种类型?

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

Python版本是2.5

Ste*_*eef 62

您可以检查变量是否为字符串或unicode字符串

isinstance(some_object, basestring)
Run Code Online (Sandbox Code Playgroud)

这将返回True字符串和unicode字符串

编辑:

你可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

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

  • python 3删除了`basestring`。改用`str`(或`bytes`,如果有字节...) (6认同)

Fog*_*ird 17

类型检查:

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

func('abc')
func(['abc', '123'])
Run Code Online (Sandbox Code Playgroud)

可变参数:

def func(*arg):
    # process

func('abc')
func('abc', '123')
func(*['abc', '123'])
Run Code Online (Sandbox Code Playgroud)


bes*_*sen 12

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
Run Code Online (Sandbox Code Playgroud)


sor*_*rin 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")
Run Code Online (Sandbox Code Playgroud)


Vla*_*den 6

>>> type('abc') is str
True
>>> type(['abc']) is str
False
Run Code Online (Sandbox Code Playgroud)

该代码与Python 2和3兼容