有没有一种方法可以检查python中变量的类型是否为string
,例如:
isinstance(x,int);
对于整数值?
isinstance(True, int) is True
。
isinstance(x,str)
在Python 3中是正确的(str是基本类型)。
有没有一种方法可以检查python中变量的类型是否为string
,例如:
isinstance(x,int);
对于整数值?
isinstance(True, int) is True
。
isinstance(x,str)
在Python 3中是正确的(str是基本类型)。
Answers:
在Python 2.x中,您可以
isinstance(s, basestring)
basestring
是抽象的超类的str
和unicode
。它可用于测试对象是否是str
或的实例unicode
。
在Python 3.x中,正确的测试是
isinstance(s, str)
bytes
在Python 3中,该类不被视为字符串类型。
unicode
对象,也应将其视为字符串。类型str
和类型unicode
都具有通用的基类basestring
,这就是您要检查的内容。
basestring = str
。
unicode
兼容性。我对Python 2和3之间的兼容性的建议是使用“六个”库。(特别是isintance(s, six.string_types)
在这种情况下)
我知道这是一个古老的话题,但是作为第一个显示在google上的话题,鉴于我没有找到满意的答案,因此我将其留在此处以供将来参考:
第六个是Python 2和3兼容性库,它已经解决了这个问题。然后,您可以执行以下操作:
import six
if isinstance(value, six.string_types):
pass # It's a string !!
检查代码,您会发现:
import sys
PY3 = sys.version_info[0] == 3
if PY3:
string_types = str,
else:
string_types = basestring,
value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)
,其中>=
假定任何最终的Python 4+都会保留str
字符串的根类。
在Python 3.x或Python 2.7.6中
if type(x) == str:
==
PEP8明确建议不要与比较类型,并且除被认为是“单项”外,还具有其他缺点,例如,它不检测的子类实例str
,也应将其视为字符串。如果您确实要检查类型str
并明确排除子类,请使用type(x) is str
。
如果要检查的内容多于整数和字符串,则类型模块也存在。 http://docs.python.org/library/types.html
types.StringTypes
。
根据以下更好的答案进行编辑。记下3个答案,找出基弦的凉爽。
旧答案:当心unicode字符串,您可以从多个地方获得unicode字符串,包括Windows中的所有COM调用。
if isinstance(target, str) or isinstance(target, unicode):
isinstance()
也将元组作为第二个参数。因此,即使basestring
不存在,也可以使用isinstance(target, (str, unicode))
。
unicode
似乎未定义:NameError: name 'unicode' is not defined
由于basestring
未在Python3中定义,因此此小技巧可能有助于使代码兼容:
try: # check whether python knows about 'basestring'
basestring
except NameError: # no, it doesn't (it's Python3); use 'str' instead
basestring=str
之后,您可以在Python2和Python3上运行以下测试
isinstance(myvar, basestring)
basestring = (str, bytes)
Python 2/3包括unicode
from __future__ import unicode_literals
from builtins import str # pip install future
isinstance('asdf', str) # True
isinstance(u'asdf', str) # True
type('foo')
为unicode
在Python 2通过默认,而第二个补充str
是实例unicode
。那使代码在Python 2和3中有效。再次感谢!
我还要注意,如果要检查变量的类型是否为特定类型,可以将变量的类型与已知对象的类型进行比较。
对于字符串,您可以使用此
type(s) == type('')
str
怎么办?那么unicode字符串呢,甚至str
在2.x中都不继承呢?isinstance(s, basestring)
在2.x或isinstance(s, str)
3.x中使用。
isinstance()
允许子类(也属于字符串,只是专门的子类),type('')
当您只能使用str
且类型为单例时,额外的调用是多余的,因此type(s) is str
将是一种更有效的测试。
其他人在这里提供了很多好的建议,但是我看不到一个很好的跨平台摘要。对于任何Python程序来说,以下内容都是不错的选择:
def isstring(s):
# if we use Python 3
if (sys.version_info[0] >= 3):
return isinstance(s, str)
# we use Python 2
return isinstance(s, basestring)
在此函数中,我们用于isinstance(object, classinfo)
查看输入是str
在Python 3中还是basestring
在Python 2中。
>=
至少要考虑一下,这可能会在Python 4中中断。
a = '1000' # also tested for 'abc100', 'a100bc', '100abc'
isinstance(a, str) or isinstance(a, unicode)
返回True
type(a) in [str, unicode]
返回True
这是我对同时支持Python 2和Python 3以及这些要求的回答:
six
或类似的compat模块,因为它们倾向于隐藏试图实现的目标。import sys
PY2 = sys.version_info.major == 2
# Check if string (lenient for byte-strings on Py2):
isinstance('abc', basestring if PY2 else str)
# Check if strictly a string (unicode-string):
isinstance('abc', unicode if PY2 else str)
# Check if either string (unicode-string) or byte-string:
isinstance('abc', basestring if PY2 else (str, bytes))
# Check for byte-string (Py3 and Py2.7):
isinstance('abc', bytes)
如果您不想依赖外部库,那么这对于Python 2.7+和Python 3(http://ideone.com/uB4Kdc)都适用:
# your code goes here
s = ["test"];
#s = "test";
isString = False;
if(isinstance(s, str)):
isString = True;
try:
if(isinstance(s, basestring)):
isString = True;
except NameError:
pass;
if(isString):
print("String");
else:
print("Not String");
您可以简单地使用isinstance函数来确保输入数据的格式为string或unicode。以下示例将帮助您轻松理解。
>>> isinstance('my string', str)
True
>>> isinstance(12, str)
False
>>> isinstance('my string', unicode)
False
>>> isinstance(u'my string', unicode)
True
这是我的方法:
if type(x) == type(str()):
type(str())
是一种非常round回的表达方式str
。类型是单例,因此type(x) is str
效率更高。isinstance()
除非您有充分的理由忽略的子类,否则应使用str
。
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True
type(thing).__name__ == 'str'
了type(thing) == str
或者isinstance(thing, str)
?也unicode
不会在Python的现代版本存在。