我有一种方法,我希望能够接受单个字符串(路径,但不一定存在于运行代码的机器上)或字符串列表/元组。
鉴于字符串充当字符列表,我如何判断该方法收到了哪种类型?
我希望能够接受单个条目的标准或 unicode 字符串,以及多个列表或元组,所以 isinstance 似乎不是答案,除非我错过了一个聪明的技巧(比如采取共同祖先类的优势?)。
Python版本是2.5
我有一种方法,我希望能够接受单个字符串(路径,但不一定存在于运行代码的机器上)或字符串列表/元组。
鉴于字符串充当字符列表,我如何判断该方法收到了哪种类型?
我希望能够接受单个条目的标准或 unicode 字符串,以及多个列表或元组,所以 isinstance 似乎不是答案,除非我错过了一个聪明的技巧(比如采取共同祖先类的优势?)。
Python版本是2.5
您可以检查变量是字符串还是 unicode 字符串
isinstance(some_object, str)
isinstance(some_object, basestring)
这将返回True
字符串和 unicode 字符串
当您使用 python 2.5 时,您可以执行以下操作:
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
严格性可能不是一个词,但我希望你明白这一点
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
类型检查:
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.x 和 3.x 兼容的最短形式:
# trick for py2/3 compatibility
if 'basestring' not in globals():
basestring = str
v = "xx"
if isinstance(v, basestring):
print("is string")
>>> type('abc') is str
True
>>> type(['abc']) is str
False
此代码与 Python 2 和 3 兼容
使用 isinstance(arg, basestring) 检查类型
我很惊讶没有人给出鸭子类型的答案,而是给出了不清楚或高度依赖于类型或版本的答案。此外,不幸的是,接受的答案对于 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
你考虑过varargs
语法吗?我不确定这是否是您要问的,但是像这样的问题会符合您的要求吗?
你不能这样做:
(i == list (i) or i == tuple (i))
如果输入是元组或列表,它会回复。唯一的问题是它不能与仅包含一个变量的元组一起正常工作。