How to find out if a Python object is a string?
如何检查python对象是否是字符串(常规或unicode)?
Python 2
使用
博士学位。
要检查对象
1 | isinstance(o, basestring) |
因为
检查
1 | type(o) is str |
检查
1 | isinstance(o, str) |
如果将
但是,您可能根本不需要执行显式类型检查。""鸭子打字"可能适合你的需要。请参见http://docs.python.org/glossary.html术语duck-typing。
另请参见在python中检查类型的规范方法是什么?
Python 3
在python 3.x中,
所以python 3.x中的签入是:
1 | isinstance(obj_to_test, str) |
这是在官方的
Python 2和3(交叉兼容)
如果不考虑python版本(2.x对3.x),请使用
1 2 3 4 | import six if isinstance(obj, six.string_types): print('obj is a string!') |
在
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进行迭代,也不会将字符串列表调用为字符串,并且它会正确地将类似于字符串的字符串检测为字符串。
当然也有缺点。例如,
我发现这更像是
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将保持其值不变。如果传递的对象实现了一个
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 |
怀斯菲什在切换到
1 2 | if type(varA) == str or type(varB) == str: print 'string involved' |
从EDX-在线课程MITX:6.00.1X使用python的计算机科学和编程简介