如何确定Python对象是否为字符串?

How to find out if a Python object is a string?

如何检查python对象是否是字符串(常规或unicode)?


Python 2

使用isinstance(obj, basestring)作为测试obj的对象。

博士学位。


要检查对象o是否是字符串类型的子类的字符串类型,请执行以下操作:

1
isinstance(o, basestring)

因为strunicode都是basestring的子类。

检查o的类型是否完全是str的类型:

1
type(o) is str

检查o是否是strstr的任何子类的实例:

1
isinstance(o, str)

如果将str替换为unicode,上述方法也适用于Unicode字符串。

但是,您可能根本不需要执行显式类型检查。""鸭子打字"可能适合你的需要。请参见http://docs.python.org/glossary.html术语duck-typing。

另请参见在python中检查类型的规范方法是什么?


Python 3

在python 3.x中,basestring不再可用,因为str是唯一的字符串类型(具有python 2.x的unicode的语义)。

所以python 3.x中的签入是:

1
isinstance(obj_to_test, str)

这是在官方的2to3转换工具修复之后:将basestring转换为str


Python 2和3(交叉兼容)

如果不考虑python版本(2.x对3.x),请使用six(pypi)及其string_types属性:

1
2
3
4
import six

if isinstance(obj, six.string_types):
    print('obj is a string!')

six中(一个非常轻的单文件模块),只需执行以下操作:

1
2
3
4
5
6
7
import sys
PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str
else:
    string_types = basestring


为了检查变量是否是您可以执行的操作:

1
2
3
s='Hello World'
if isinstance(s,str):
#do something here,

isInstance的输出将为您提供一个布尔值true或false,因此您可以相应地进行调整。您可以通过以下方法检查您的值的预期首字母缩写:类型(s)这将返回键入"str",以便在isInstance函数中使用它。


如果希望远离显式类型检查(并且有充分的理由远离它),那么要检查的字符串协议最安全的部分可能是:

1
str(maybe_string) == maybe_string

它不会通过iterable或iterator进行迭代,也不会将字符串列表调用为字符串,并且它会正确地将类似于字符串的字符串检测为字符串。

当然也有缺点。例如,str(maybe_string)可能是一个繁重的计算。答案通常是视情况而定。


我发现这更像是pythonic

1
2
3
if type(aObject) is str:
    #do your stuff here
    pass

因为type对象是singleton,所以is可以用来比较对象和str类型。


我可以像其他人提到的那样,用鸭式打字的方式来处理这个问题。我怎么知道一根弦真的是一根弦?很明显,把它转换成一个字符串!

1
2
3
def myfunc(word):
    word = unicode(word)
    ...

如果arg已经是字符串或Unicode类型,则real_word将保持其值不变。如果传递的对象实现了一个__unicode__方法,该方法用于获取其unicode表示。如果传递的对象不能用作字符串,则unicode内置将引发异常。


1
isinstance(your_object, basestring)

如果对象确实是字符串类型,则为"真"。str'是保留字。

我的歉意,正确的答案是使用"basestring"而不是"str",以便包括unicode字符串,正如上面由其他响应程序之一指出的那样。


今天晚上,我遇到了一种情况,我以为我得去检查一下埃多克斯(EDOCX1)(3)型,但事实证明我没有。

我解决问题的方法可能在许多情况下都有效,因此我在下面提供它,以防其他阅读此问题的人感兴趣(仅限Python3)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# NOTE: fields is an object that COULD be any number of things, including:
# - a single string-like object
# - a string-like object that needs to be converted to a sequence of
# string-like objects at some separator, sep
# - a sequence of string-like objects
def getfields(*fields, sep=' ', validator=lambda f: True):
    '''Take a field sequence definition and yield from a validated
     field sequence. Accepts a string, a string with separators,
     or a sequence of strings'''

    if fields:
        try:
            # single unpack in the case of a single argument
            fieldseq, = fields
            try:
                # convert to string sequence if string
                fieldseq = fieldseq.split(sep)
            except AttributeError:
                # not a string; assume other iterable
                pass
        except ValueError:
            # not a single argument and not a string
            fieldseq = fields
        invalid_fields = [field for field in fieldseq if not validator(field)]
        if invalid_fields:
            raise ValueError('One or more field names is invalid:
'

                             '{!r}'.format(invalid_fields))
    else:
        raise ValueError('No fields were provided')
    try:
        yield from fieldseq
    except TypeError as e:
        raise ValueError('Single field argument must be a string'
                         'or an interable') from e

一些测试:

1
2
3
4
5
6
7
8
from . import getfields

def test_getfields_novalidation():
    result = ['a', 'b']
    assert list(getfields('a b')) == result
    assert list(getfields('a,b', sep=',')) == result
    assert list(getfields('a', 'b')) == result
    assert list(getfields(['a', 'b'])) == result

您可以使用空字符串连接来测试它:

1
2
3
4
5
6
def is_string(s):
  try:
    s += ''
  except:
    return False
  return True

编辑:

在评论指出列表失败后更正我的答案

1
2
def is_string(s):
  return isinstance(s, basestring)


对于一个很好的类似字符串的duck输入方法,它的优点是可以同时使用python 2.x和3.x:

1
2
3
4
5
6
def is_string(obj):
    try:
        obj + ''
        return True
    except TypeError:
        return False

怀斯菲什在切换到isinstance方法之前就已经很熟悉鸭子的打字了,只是+=对于列表的含义与+的含义不同。


1
2
if type(varA) == str or type(varB) == str:
    print 'string involved'

从EDX-在线课程MITX:6.00.1X使用python的计算机科学和编程简介