如何检查Python对象是字符串(常规还是Unicode)?
如何检查Python对象是字符串(常规还是Unicode)?
Answers:
要检查对象o
是否是字符串类型的子类的字符串类型:
isinstance(o, basestring)
因为str
和和unicode
都是的子类basestring
。
检查的类型o
是否完全是str
:
type(o) is str
检查是否o
是的实例str
或的任何子类str
:
isinstance(o, str)
以上还为Unicode字符串的工作,如果你更换str
使用unicode
。
但是,您可能根本不需要进行显式类型检查。“鸭子打字”可能符合您的需求。请参阅http://docs.python.org/glossary.html#term-duck-typing。
basestring
py2。
在Python 3.x basestring
中,str
唯一的字符串类型(具有Python 2.x的语义unicode
)不再可用。
因此,Python 3.x中的检查只是:
isinstance(obj_to_test, str)
这是对官方转换工具的修复2to3
:转换basestring
为str
。
如果您不想检查Python版本(2.x与3.x),请使用six
(PyPI)及其string_types
属性:
import six
if isinstance(obj, six.string_types):
print('obj is a string!')
在six
(一个重量很轻的单文件模块)中,它只是在做这件事:
import sys
PY3 = sys.version_info[0] == 3
if PY3:
string_types = str
else:
string_types = basestring
basestring
,然后退回到str
。例如def is_string(obj): try: return isinstance(obj, basestring) # python 2 except NameError: return isinstance(obj, str) # python 3
我发现了这个更多pythonic
:
if type(aObject) is str:
#do your stuff here
pass
由于类型对象是单例,因此可以用于将对象与str类型进行比较
isinstance(obj_to_test, str)
显然是为了测试类型,它具有与其他非str案例使用相同过程的优势。
如果一个人想从明确的类型检查(也有说走就走是很好的理由远离它),可能是最安全的弦协议的一部分,以检查:
str(maybe_string) == maybe_string
它不会通过迭代的迭代或迭代器,它不会调用列表的串一个字符串,它正确地检测弦乐器的弦。
当然有缺点。例如,str(maybe_string)
可能是繁重的计算。通常,答案取决于它。
编辑:作为@Tcll 指出的意见,问题实际上询问的方式同时检测unicode字符串和字节串。在Python 2上,此答案将失败,但包含非ASCII字符的unicode字符串将例外,在Python 3上,它将False
为所有字节串返回。
b = b'test'; r = str(b) == b
其中b
保存的数据与str(b)
(但作为字节对象的)相同,但不能验证为字符串。
为了检查您的变量是否是某些东西,您可以像这样:
s='Hello World'
if isinstance(s,str):
#do something here,
isistance的输出将为您提供布尔值True或False,以便您可以进行相应的调整。您可以通过最初使用以下命令检查您的值的期望首字母缩写:type(s)这将返回您键入“ str”,以便您可以在isistance函数中使用它。
今天晚上,我遇到了一种情况,我以为我必须检查一下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
它很简单,请使用以下代码(我们假设提到的对象为obj)-
if type(obj) == str:
print('It is a string')
else:
print('It is not a string.')
您可以通过连接一个空字符串来测试它:
def is_string(s):
try:
s += ''
except:
return False
return True
编辑:
在指出指出列表失败的评论后纠正我的答案
def is_string(s):
return isinstance(s, basestring)
对于类似字符串的鸭式打字方法,它具有同时使用Python 2.x和3.x的优点:
def is_string(obj):
try:
obj + ''
return True
except TypeError:
return False
isalpha
,但是谁知道可以安全地查找哪些方法?
try
则可以更快。如果您有99%的期望,也许不是。性能差异很小,最好是习惯性的,除非您分析代码并将其标识为实际上很慢。
if type(varA) == str or type(varB) == str:
print 'string involved'
来自EDX-在线课程MITx:6.00.1x使用Python进行计算机科学和编程简介
str
!的子类。