如何检查变量的类型是否为字符串?


766

有没有一种方法可以检查python中变量的类型是否为string,例如:

isinstance(x,int);

对于整数值?


11
如果您正在学习python canonical.org/~kragen/isinstance,则必须阅读isinstance 。
whaley 2011年


从此小心一点isinstance(True, int) is True
艾伯特·图古舍夫

isinstance(x,str)在Python 3中是正确的(str是基本类型)。
MasterControlProgram

Answers:


1137

在Python 2.x中,您可以

isinstance(s, basestring)

basestring抽象的超类strunicode。它可用于测试对象是否是str或的实例unicode


在Python 3.x中,正确的测试是

isinstance(s, str)

bytes在Python 3中,该类不被视为字符串类型。


10
@Yarin:否。但这没关系,因为Python 3.x根本不意味着要与Python 2.x兼容。
netcoder

2
我发现isinstance(s,str)可与py27一起使用,并在以下环境中进行测试:Python 2.7.5(默认值,2013年8月25日,00:04:04)[GCC 4.2.1兼容Apple LLVM 5.0(clang-500.0.68)]在达尔文。
kakyo

25
@kakyo:问题在于它将丢失unicode对象,也应将其视为字符串。类型str和类型unicode都具有通用的基类basestring,这就是您要检查的内容。
Sven Marnach 2014年

7
@Yarin如果要将2.x移植到3.x,则始终可以分配basestring = str
2015年

9
@AdamErickson到底要兼容什么?它与Python 3的兼容性无济于事,因为Python 3中没有unicode兼容性。我对Python 2和3之间的兼容性的建议是使用“六个”库。(特别是isintance(s, six.string_types)在这种情况下)
Sven Marnach '16

222

我知道这是一个古老的话题,但是作为第一个显示在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,

4
例如,一个内衬:value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring),其中>=假定任何最终的Python 4+都会保留str字符串的根类。
Pi Marillion

63

在Python 3.x或Python 2.7.6中

if type(x) == str:

10
我喜欢“(str,unicode)中的if type(x):”的优雅风格,但是我看到PyLint将其标记为“ unidiomatic”。
eukras

15
==PEP8明确建议不要与比较类型,并且除被认为是“单项”外,还具有其他缺点,例如,它不检测的子类实例str,也应将其视为字符串。如果您确实要检查类型str并明确排除子类,请使用type(x) is str
Sven Marnach '17

17

你可以做:

var = 1
if type(var) == int:
   print('your variable is an integer')

要么:

var2 = 'this is variable #2'
if type(var2) == str:
    print('your variable is a string')
else:
    print('your variable IS NOT a string')

希望这可以帮助!



11

根据以下更好的答案进行编辑。记下3个答案,找出基弦的凉爽。

旧答案:当心unicode字符串,您可以从多个地方获得unicode字符串,包括Windows中的所有COM调用。

if isinstance(target, str) or isinstance(target, unicode):

1
接得好。我不知道基本字符串。上面提到了3个帖子,似乎是一个更好的答案。
Wade Hatler

6
isinstance()也将元组作为第二个参数。因此,即使basestring不存在,也可以使用isinstance(target, (str, unicode))
马丁·彼得斯

3
在python 3.5.1中,unicode似乎未定义:NameError: name 'unicode' is not defined
Eric Hu

11

由于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)

4
或者,如果您也想捕获字节字符串:basestring = (str, bytes)
Mark Ransom

10

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

http://python-future.org/overview.html


1
非常感谢!互联网上有很多答案,但唯一的好处就是这个。第一行使得type('foo')unicode在Python 2通过默认,而第二个补充str是实例unicode。那使代码在Python 2和3中有效。再次感谢!
Narann

9

我还要注意,如果要检查变量的类型是否为特定类型,可以将变量的类型与已知对象的类型进行比较。

对于字符串,您可以使用此

type(s) == type('')

7
这是在python中键入check的一种糟糕的方法。如果另一个类继承自该str怎么办?那么unicode字符串呢,甚至str在2.x中都不继承呢?isinstance(s, basestring)在2.x或isinstance(s, str)3.x中使用。
杰克

1
@Jack,请阅读问题,还请注意,我没有写这是最好的方法,只是另一种方法。
丹尼尔·格兰金

9
这是一个坏主意,原因有以下三个:isinstance()允许子类(也属于字符串,只是专门的子类),type('')当您只能使用str且类型为单例时,额外的调用是多余的,因此type(s) is str将是一种更有效的测试。
马丁·彼得斯

8

其他人在这里提供了很多好的建议,但是我看不到一个很好的跨平台摘要。对于任何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中。


1
>=至少要考虑一下,这可能会在Python 4中中断。
塔基斯

2
更清洁以检查six.string_types或six.text_type
daonb

@daonb导入整个模块只是为了进行单行测试是一种想法,它导致疯狂的依赖树和严重的膨胀毁坏了应该是短小又简单的内容。当然,这是您的电话,但请说“ n ...”
duanev

@duanev如果您担心Python 2/3的兼容性,最好还是在项目中使用六个。六个也是单个文件,因此依赖树/膨胀不是这里的问题。
MoxieBall

7

不使用basestring的Python 2替代方法:

isinstance(s, (str, unicode))

但由于unicode未定义(在Python 3中),因此在Python 3中仍然无法使用。


7

所以,

您可以使用很多选项来检查变量是否为字符串:

a = "my string"
type(a) == str # first 
a.__class__ == str # second
isinstance(a, str) # third
str(a) == a # forth
type(a) == type('') # fifth

此命令是有目的的。


5
a = '1000' # also tested for 'abc100', 'a100bc', '100abc'

isinstance(a, str) or isinstance(a, unicode)

返回True

type(a) in [str, unicode]

返回True


对于Python 2.7.12,我必须删除引号:[str,unicode]中的type(a)
Adam Erickson

4

这是我对同时支持Python 2和Python 3以及这些要求的回答:

  • 用最少的Py2兼容代码以Py3代码编写。
  • 稍后删除Py2兼容代码而不会受到干扰。即仅旨在删除,不修改Py3代码。
  • 避免使用 six或类似的compat模块,因为它们倾向于隐藏试图实现的目标。
  • 面向未来的潜在Py4。

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)

1

如果您不想依赖外部库,那么这对于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");

1

您可以简单地使用isinstance函数来确保输入数据的格式为stringunicode。以下示例将帮助您轻松理解。

>>> isinstance('my string', str)
True
>>> isinstance(12, str)
False
>>> isinstance('my string', unicode)
False
>>> isinstance(u'my string',  unicode)
True


-6

这是我的方法:

if type(x) == type(str()):

4
type(str())是一种非常round回的表达方式str。类型是单例,因此type(x) is str效率更高。isinstance()除非您有充分的理由忽略的子类,否则应使用str
马丁·彼得斯

如果type(x)是str:
shaurya uppal,


-13
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True

2
在这种情况下,你会喜欢type(thing).__name__ == 'str'type(thing) == str或者isinstance(thing, str)?也unicode不会在Python的现代版本存在。
vaultah
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.