我有一个方法,我希望能够接受单个字符串(路径,但不一定是运行代码的机器上存在的路径)或字符串列表/元组。
鉴于字符串充当字符列表,我怎么知道该方法收到了哪种?
我希望能够接受单个条目的标准字符串或unicode字符串,以及多个列表或元组,所以isinstance似乎不是答案,除非我错过了一个聪明的技巧(比如利用共同的祖先类?)。
Python版本为2.5
答案 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))
如果输入是元组或列表,它将回复。唯一的问题是它不能正确处理仅包含一个变量的元组。