64

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

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

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

Python版本是2.5

4

9 回答 9

72

您可以检查变量是字符串还是 unicode 字符串

  • 蟒蛇 3:
    isinstance(some_object, str)
  • 蟒蛇2:
    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

严格性可能不是一个词,但我希望你明白这一点

于 2009-05-28T19:39:05.493 回答
24

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
于 2009-05-28T19:41:12.260 回答
18

类型检查:

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'])
于 2009-05-28T19:39:42.403 回答
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")
于 2014-11-07T09:10:54.913 回答
5
>>> type('abc') is str
True
>>> type(['abc']) is str
False

此代码与 Python 2 和 3 兼容

于 2017-05-17T19:01:55.250 回答
3

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

于 2009-05-28T19:39:30.673 回答
3

我很惊讶没有人给出鸭子类型的答案,而是给出了不清楚或高度依赖于类型或版本的答案。此外,不幸的是,接受的答案对于 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
于 2020-11-25T14:27:25.780 回答
1

你考虑过varargs语法吗?我不确定这是否是您要问的,但是像这样的问题会符合您的要求吗?

于 2009-05-28T19:36:46.980 回答
-2

你不能这样做:

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

如果输入是元组或列表,它会回复。唯一的问题是它不能与仅包含一个变量的元组一起正常工作。

于 2016-10-13T23:22:36.973 回答