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

时间:2009-08-19 23:50:58

标签: python string types compatibility

如何检查Python对象是否为字符串(常规或Unicode)?

14 个答案:

答案 0 :(得分:292)

Python 2

使用isinstance(obj, basestring)进行对象测试obj

Docs

答案 1 :(得分:151)

检查对象o是否是字符串类型的子类的字符串类型:

isinstance(o, basestring)

因为strunicode都是basestring的子类。

要检查o的类型是否正好str

type(o) is str

要检查ostr的实例还是str的任何子类:

isinstance(o, str)

如果您将str替换为unicode,则上述内容也适用于Unicode字符串。

但是,您可能根本不需要进行显式类型检查。 “鸭子打字”可能适合您的需求。请参阅http://docs.python.org/glossary.html#term-duck-typing

另见What’s the canonical way to check for type in python?

答案 2 :(得分:129)

Python 3

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

因此,Python 3.x中的检查只是:

isinstance(obj_to_test, str)

这是the fix官方2to3转换工具的结果:将basestring转换为str

答案 3 :(得分:85)

Python 2和3

(横尺寸)

如果您想检查不考虑Python版本(2.x vs 3.x),请使用sixPyPI)及其string_types属性:

import six

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

six(一个非常轻量级的单文件模块)中,它只是在做this

import sys
PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str
else:
    string_types = basestring

答案 4 :(得分:11)

我发现这个更多pythonic

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

由于类型对象是单例,可用于将对象与str类型进行比较

答案 5 :(得分:11)

为了检查你的变量是否适合你:

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

isistance的输出将为您提供布尔值True或False值,以便您可以相应地进行调整。 您可以通过以下方式检查您的值的预期首字母缩略词:     类型 这将使您返回键入' str'所以你可以在isistance函数中使用它。

答案 6 :(得分:11)

如果有人想远离明确的类型检查( 远离它的好理由),可能要检查的字符串协议中最安全的部分是:

str(maybe_string) == maybe_string

它不会迭代迭代或迭代器,它不会将字符串列表调用为字符串,而是正确地将stringlike检测为字符串。

当然有缺点。例如,str(maybe_string)可能是一个繁重的计算。通常情况下,答案是取决于

答案 7 :(得分:5)

我可能会像其他人提到的那样以鸭子打字的方式处理这个问题。我怎么知道字符串真的是一个字符串?好吧,显然是通过转换为字符串!

def myfunc(word):
    word = unicode(word)
    ...

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

答案 8 :(得分:3)

isinstance(your_object, basestring)
如果您的对象确实是字符串类型,则

将为True。 'str'是保留字。

我道歉, 正确答案是使用'basestring'而不是'str'按顺序包含unicode字符串 - 正如上面其他一位响应者所说的那样。

答案 9 :(得分:3)

很简单,使用下面的代码(我们假设提到的对象是obj)-

if type(obj) == str:
    print('It is a string')
else:
    print('It is not a string.')

答案 10 :(得分:1)

您可以通过连接空字符串来测试它:

def is_string(s):
  try:
    s += ''
  except:
    return False
  return True

修改

在评论指出这与列表

失败后,纠正我的回答
def is_string(s):
  return isinstance(s, basestring)

答案 11 :(得分:1)

今天晚上我遇到了一种情况,我想到我将不得不检查str类型,但事实证明我没有。

我解决问题的方法可能适用于很多情况,所以我在下面提供它以防其他人阅读这个问题感兴趣(仅限Python 3)。

# 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:\n'
                             '{!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

一些测试:

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

答案 12 :(得分:-1)

对于类似于字符串的精美鸭子类型方法,可以使用Python 2.x和3.x:

def is_string(obj):
    try:
        obj + ''
        return True
    except TypeError:
        return False
在切换到isinstance方法之前,

wisefish与鸭子打字很接近,除了+=对列表的含义与+不同。

答案 13 :(得分:-4)

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

这 EDX - 在线课程 MITx:6.00.1x计算机科学概论和使用Python编程