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

How to check if type of a variable is string? [duplicate]

提问人:c_pleaseUpvote 提问时间:1/30/2011 最后编辑:Arsen Khachaturyanc_pleaseUpvote 更新时间:8/15/2022 访问量:1376154

问:

这个问题在这里已经有答案了:
去年关闭。

社群在 4 个月前审查了是否重新打开这个问题,并将其关闭:

原始关闭原因未解决

有没有办法检查python中变量的类型是否为,例如:string

isinstance(x,int);

对于整数值?

Python 字符串 变量 类型

评论

17赞 whaley 1/30/2011
如果您正在学习 python canonical.org/~kragen/isinstance,则需要阅读 isinstance。
0赞 Gary Gauh 12/9/2015
查看 stackoverflow.com/a/1979107/1145750
3赞 Albert Tugushev 10/18/2019
小心 ints,因为 .isinstance(True, int) is True
2赞 MasterControlProgram 5/29/2020
isinstance(x,str)在 Python 3 中是正确的(str 是基本类型)。
2赞 Gabriel Staples 8/26/2021
简单地说:?我给出了答案type(my_variable) is str

答:

1527赞 Sven Marnach 1/30/2011 #1

在 Python 3.x 中,检查是否为字符串的正确方法是s

isinstance(s, str)

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


在 Python 2.x 中,正确的检查是

isinstance(s, basestring)

basestring是 和 的抽象超类。它可用于测试对象是否是 或 的实例。strunicodestrunicode

评论

12赞 netcoder 7/16/2013
@Yarin:没有。但这并不重要,因为 Python 3.x 根本不意味着与 Python 2.x 兼容。
2赞 kakyo 1/17/2014
我发现 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)] 在达尔文。
26赞 Sven Marnach 1/17/2014
@kakyo:问题在于它会丢失对象,这些对象也应该被视为字符串。类型和类型都具有公共基类,这是您要检查的内容。unicodestrunicodebasestring
7赞 Jacklynn 4/21/2015
@Yarin如果要将某些内容从 2.x 移植到 3.x,则始终可以分配 .basestring = str
10赞 Sven Marnach 8/12/2016
@AdamErickson 为了与什么兼容?它无助于与 Python 3 的兼容性,因为 Python 3 中没有。我对 Python 2 和 3 之间的兼容性的建议是使用“six”库。(特别是在这种情况下)unicodeisintance(s, six.string_types)
14赞 dicato 1/31/2011 #2

如果您检查的 int 和字符串不止于此,则类型模块也存在。http://docs.python.org/library/types.html

评论

5赞 musiphil 10/16/2015
更具体地说,类型。StringTypes
2赞 Ibrahim 2/15/2018
类型。StringTypes 似乎不再存在于 Python 3 :(
0赞 Edward Falk 9/17/2021
types.StringTypes未针对 Python3 定义
13赞 Wade Hatler 11/20/2012 #3

根据下面的更好答案进行编辑。接下来大约有 3 个答案,并了解 basestring 的酷炫之处。

旧答案: 请注意 unicode 字符串,可以从多个位置获取这些字符串,包括 Windows 中的所有 COM 调用。

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

评论

1赞 Wade Hatler 2/20/2014
好渔获。我不知道基字符串。它被提到了大约 3 个帖子,似乎是一个更好的答案。
7赞 Martijn Pieters 6/13/2015
isinstance()也采用元组作为第二个参数。因此,即使不存在,您也可以使用 .basestringisinstance(target, (str, unicode))
5赞 Eric Hu 2/19/2016
在 python 3.5.1 中,似乎没有定义:unicodeNameError: name 'unicode' is not defined
6赞 yprez 8/22/2013 #4

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

isinstance(s, (str, unicode))

但仍然无法在 Python 3 中工作,因为未定义(在 Python 3 中)。unicode

8赞 Daniil Grankin 10/20/2013 #5

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

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

type(s) == type('')

评论

9赞 Jacklynn 4/21/2015
这是一种可怕的、可怕的在 python 中键入检查的方法。如果另一个类继承自 怎么办?在 2.x 中甚至不继承的 unicode 字符串呢?在 2.x 或 3.x 中使用。strstrisinstance(s, basestring)isinstance(s, str)
2赞 Daniil Grankin 4/24/2015
@Jack,请阅读问题,并注意我没有写这是最好的方法,只是另一种方法。
10赞 Martijn Pieters 6/13/2015
这是一个坏主意,原因有 3 个:允许子类(也是字符串,只是专用的),当您可以使用并且类型是单例时,额外的调用是多余的,因此将是一个更有效的测试。isinstance()type('')strtype(s) is str
241赞 André Fratelli 12/16/2013 #6

我知道这是一个古老的话题,但是作为谷歌上显示的第一个话题,鉴于我没有找到任何令人满意的答案,我将把它留在这里以备将来参考:

six 是一个 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,

评论

6赞 Pi Marillion 10/22/2016
例如,对于一行: ,其中假设任何最终的 Python 4+ 都保留字符串的根类。value_is_string = isinstance(value, str if sys.version_info[0] >= 3 else basestring)>=str
2赞 Edward Falk 8/8/2021
six 不是标准 Python 安装的一部分,因此几乎根据定义是不可移植的。我想编写一个简单的 Python 应用程序,并让它“为运行它的人工作”。如果我告诉他们“首先,你需要安装这个其他库,只是使用我的应用程序”,这是一个大问题。
0赞 André Fratelli 8/10/2021
这就是实现代码存在的原因。
0赞 Edward Falk 9/17/2021
该库似乎仅适用于我的 Mac 上的 Python2。如果它的可用性是特定于版本的,那么您最好首先使用特定于版本的解决方案之一。six
0赞 André Fratelli 2/18/2022
代码扩展的内容就写在那里。你可以使用它。关键是,根据 Python 库认为的字符串类型,这里的其他答案是错误的。
1赞 mPrinC 6/1/2014 #7

如果您不想依赖外部库,这适用于 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");
-6赞 User 7/25/2014 #8

我是这样做的:

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

评论

5赞 Martijn Pieters 6/13/2015
type(str())是一种非常迂回的说法。类型是单例的,因此效率更高。 应该改用,除非你有很好的理由忽略 的子类。strtype(x) is strisinstance()str
0赞 Shaurya Uppal 5/21/2019
如果 type(x) 为 str:
-8赞 fast tooth 10/30/2014 #9

我见过:

hasattr(s, 'endswith') 
115赞 Texom512 11/9/2014 #10

在 Python 3.x 或 Python 2.7.6 中

if type(x) == str:

评论

12赞 eukras 12/23/2015
我喜欢“if type(x) in (str, unicode):”的优雅,但我看到 PyLint 将其标记为“unidiomatic”。
41赞 Sven Marnach 10/28/2017
PEP8 明确不鼓励将类型与进行比较,除了被认为是“单调的”之外,它还有几个缺点,例如,它不检测 的子类的实例,这些子类也应该被视为字符串。如果确实要检查确切的类型并显式排除子类,请使用 .==strstrtype(x) is str
0赞 sinekonata 3/21/2021
@SvenMarnach 那么是否应该使用 isinstance 来包含子类呢?
3赞 Sven Marnach 3/21/2021
@sinekonata 是的,检查字符串的最常见和推荐方法是在 Python 3.x 中——请参阅我上面的回答。只有当你有特定的理由排除子类(这应该很少见)时,才应该使用 .isinstance(s, str)type(s) is str
0赞 Edward Falk 8/8/2021
type(x) == str不适用于 Python2 中的 unicode 字符串。 是 Python3 中的错误。type(x) in (str, unicode)
11赞 crizCraig 6/2/2015 #11

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赞 Narann 10/8/2019
多谢!互联网上有几十种不同的答案,但唯一好的就是这个。第一行使 在 python 2 中默认为 ,第二行使 是 的实例。这些使代码在 Python 2 和 3 中有效。再次感谢!type('foo')unicodestrunicode
13赞 umläute 9/17/2015 #12

由于 Python3 中没有定义,这个小技巧可能有助于使代码兼容:basestring

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)

评论

5赞 Mark Ransom 3/27/2016
或者,如果您也想捕获字节字符串:basestring = (str, bytes)
10赞 duanev 3/11/2016 #13

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

在这个函数中,我们用来查看我们的输入是 Python 3 中的 a 还是 Python 2 中的 a。isinstance(object, classinfo)strbasestring

评论

2赞 thakis 12/16/2016
至少在 Python 4 中,这可能会中断。>=
2赞 daonb 1/3/2017
更清洁地检查six.string_types或six.text_type
1赞 duanev 1/15/2017
@daonb仅仅为了进行单行测试而导入整个模块的想法会导致疯狂的依赖树和严重的膨胀破坏本应简短、小而简单的东西。当然,这是你的电话,但只要说......
0赞 MoxieBall 5/24/2018
@duanev,如果您担心 Python 2/3 的兼容性,那么无论如何在项目中使用 6 个是个更好的主意。Six 也是一个文件,因此依赖树/膨胀在这里不是问题。
0赞 Edward Falk 9/17/2021
另外,至少在我的 Mac 上,是 Python3 中的错误import six
26赞 F. Taylor 8/7/2016 #14

您可以执行以下操作:

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')

希望这有帮助!

评论

1赞 xCovelus 12/2/2020
最好使用 ,因为 PEP8 不推荐使用来比较类型type(var) is int==
1赞 Hassan Mehmood 8/9/2016 #15

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

>>> isinstance('my string', str)
True
>>> isinstance(12, str)
False
>>> isinstance('my string', unicode)
False
>>> isinstance(u'my string',  unicode)
True
-2赞 vadim vaduxa 8/9/2016 #16
s = '123'
issubclass(s.__class__, str)
9赞 PatNowak 8/9/2016 #17

所以

你有很多选项来检查你的变量是否为字符串:

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

此订单是有目的的。

评论

0赞 Edward Falk 9/17/2021
这是测试类型的方法的一个很好的纲要。但是,在 Python2 中,如果您将 unicode 视为字符串类型,这将不起作用。
5赞 be_good_do_good 8/9/2016 #18
a = '1000' # also tested for 'abc100', 'a100bc', '100abc'

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

返回 True

type(a) in [str, unicode]

返回 True

评论

0赞 Adam Erickson 8/12/2016
对于 Python 2.7.12,我不得不删除引号: type(a) in [str, unicode]
0赞 Edward Falk 9/17/2021
不适用于 Python3
6赞 Cas 2/28/2017 #19

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

  • 用 Py3 代码编写,具有最少的 Py2 兼容代码。
  • 稍后删除 Py2 兼容代码,而不会中断。即仅以删除为目标,不修改 Py3 代码。
  • 避免使用或类似的兼容模块,因为它们往往会隐藏什么 正在努力实现。six
  • 面向未来的潜在 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)
-14赞 Richard Urban 1/12/2018 #20
>>> thing = 'foo'
>>> type(thing).__name__ == 'str' or type(thing).__name__ == 'unicode'
True

评论

4赞 vaultah 1/12/2018
在哪种情况下,您更喜欢 OR ?在现代版本的 Python 中也不存在。type(thing).__name__ == 'str'type(thing) == strisinstance(thing, str)unicode
0赞 Edward Falk 8/8/2021 #21

总结:

如果您同时想要 Python2 和 Python3,并且还想包含 unicode,似乎没有一种可移植的方法可以做到这一点。我最终使用了这个成语:

# Near the top of my program
if sys.version_info[0] >= 3:
    basestring = str

然后,每当我想测试一个对象以查看它是否是一个字符串时:

if isinstance(obj, basestring):
    ...

坦率地说,我对 Python3 删除了基本字符串和类型感到有点震惊。StringTypes。我认为没有理由放弃它们,保留它们中的任何一个都会使这个问题得到解决。

23赞 Gabriel Staples 8/26/2021 #22

使用或type()isinstance()

我不知道为什么在我面前没有一个答案包含这个简单的语法,但到目前为止,这样使用对我来说似乎是最合乎逻辑和最简单的:type(my_variable) is strtype()

(在 Python3 中测试):

# Option 1: check to see if `my_variable` is of type `str`
type(my_variable) is str

# Option 2: check to see if `my_variable` is of type `str`, including
# being a subclass of type `str` (ie: also see if `my_variable` is any object 
# which inherits from `str` as a parent class)
isinstance(my_variable, str)

Python 内置函数文档位于:https://docs.python.org/3/library/functions.html#type。它部分陈述了以下内容。请注意以下说明:type()isinstance()

class type(object)
class type(name, bases, dict, **kwds)

使用一个参数,返回对象的类型。返回值是一个类型对象,通常与 返回的对象相同。object.__class__

建议使用内置函数来测试对象的类型,因为它考虑了子类。isinstance()

因此,如果您要检查类对象的类型而不是简单变量,并且需要考虑子类,请改用。请参阅此处的文档:https://docs.python.org/3/library/functions.html#isinstanceisinstance()

示例代码:

my_str = "hello"
my_int = 7

print(type(my_str) is str)
print(type(my_int) is str)

print()
print(isinstance(my_str, str))
print(isinstance(my_int, str))

输出:

True
False

True
False