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

c_p*_*ote 705 python string variables types

有没有办法检查python中的变量类型是否为字符串..就像

isinstance(x,int);
Run Code Online (Sandbox Code Playgroud)

对于整数值?

Sve*_*ach 1049

在Python 2.x中,你会这样做

isinstance(s, basestring)
Run Code Online (Sandbox Code Playgroud)

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


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

isinstance(s, str)
Run Code Online (Sandbox Code Playgroud)

bytes类不被认为是在Python 3字符串类型.

  • @kakyo:问题是它会错过`unicode`对象,它们也应该被认为是字符串.类型`str`和类型`unicode`都有公共基类`basestring`,这就是你要检查的内容. (23认同)
  • `isinstance(s,basestring)`在3.x中工作吗? (22认同)
  • @Yarin:没有.但是没关系,因为Python 3.x根本不兼容Python 2.x. (10认同)
  • @AdamErickson为了兼容什么?它与Python 3的兼容性没有帮助,因为Python 3中没有"unicode".我对Python 2和3之间兼容性的建议是使用"六"库.(特别是`isintance(s,six.string_types)`在这种情况下) (8认同)
  • @Yarin如果你从2.x移植到3.x,你总是可以指定`basestring = str`. (7认同)
  • 我发现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)]在达尔文. (2认同)

And*_*lli 218

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

six是Python 2和3兼容库,已经涵盖了这个问题.然后你可以做这样的事情:

import six

if isinstance(value, six.string_types):
    pass # It's a string !!
Run Code Online (Sandbox Code Playgroud)

检查代码,这是你发现的:

import sys

PY3 = sys.version_info[0] == 3

if PY3:
    string_types = str,
else:
    string_types = basestring,
Run Code Online (Sandbox Code Playgroud)

  • 例如,一个内衬:“ value_is_string = isinstance(value,str,如果sys.version_info [0]> = 3 else basestring)”,其中“> =”假定任何最终的Python 4+都保留字符串的“ str”根类。 (3认同)
  • 6 不是标准 Python 安装的一部分,因此根据定义几乎是不可移植的。我想编写一个简单的 Python 应用程序,并让它为任何运行它的人“正常工作”。如果我告诉他们“首先,你需要安装这个*其他*库,只需使用我的应用程序”,那就是一个大问题。 (2认同)

Tex*_*512 55

在Python 3.x或Python 2.7.6中

if type(x) == str:
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不适用于unicode文字. (11认同)
  • 我喜欢"if(x)in(str,unicode):"的优雅,但是我看到PyLint将它标记为"unidiomatic". (9认同)
  • PEP8明确地不鼓励用"=="比较类型,并且除了被认为是"单一的"之外还有几个缺点,例如它不检测`str`的​​子类的实例,它们也应该被认为是字符串.如果你真的想要检查类型`str`并明确排除子类,请使用`type(x)is str`. (9认同)
  • @sinekonata 是的,检查字符串的最常见和推荐的方法是 Python 3.x 中的 `isinstance(s, str)` - 请参阅上面的答案。仅当您有特定原因排除子类(这应该很少见)时,您才应该使用“type(s) is str”。 (2认同)

Gab*_*les 24

使用type()isinstance()

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

(在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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

示例代码:

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))
Run Code Online (Sandbox Code Playgroud)

输出:

True
False

True
False
Run Code Online (Sandbox Code Playgroud)


F. *_*lor 15

你可以做:

var = 1
if type(var) == int:
   print('your variable is an integer')
Run Code Online (Sandbox Code Playgroud)

要么:

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

希望这可以帮助!


dic*_*ato 13

如果要检查的不仅仅是整数和字符串,那么类型模块也存在. http://docs.python.org/library/types.html

  • 更具体地说,[`types.StringTypes`](https://docs.python.org/2/library/types.html#types.StringTypes). (5认同)
  • types.StringTypes在Python 3中似乎不再存在:( (2认同)

uml*_*ute 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
Run Code Online (Sandbox Code Playgroud)

之后,您可以在Python2和Python3上运行以下测试

isinstance(myvar, basestring)
Run Code Online (Sandbox Code Playgroud)

  • 或者如果你想捕获字节字符串:`basestring =(str,bytes)` (4认同)

Wad*_*ler 10

根据以下更好的答案进行编辑.下来大约3个答案,找出basetring的凉爽.

旧答案:注意unicode字符串,您可以从多个地方获取,包括Windows中的所有COM调用.

if isinstance(target, str) or isinstance(target, unicode):
Run Code Online (Sandbox Code Playgroud)

  • 这不是什么`basestring`是有益的吗? (8认同)
  • `isinstance()`也将*tuple*作为第二个参数.所以即使`basestring`不存在,你也可以使用`isinstance(target,(str,unicode))`. (6认同)
  • 在python 3.5.1中,似乎没有定义`unicode`:`NameError:name'unicode'未定义` (3认同)

cri*_*aig 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
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*kin 8

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

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

type(s) == type('')
Run Code Online (Sandbox Code Playgroud)

  • 这是一个坏主意有三个原因:`isinstance()`允许子类(也是字符串,只是专门的),额外的`type('')`调用是冗余的,当你可以使用`str`和类型是单身,所以`type(s)is str`将是一个更有效的测试. (9认同)
  • 这是在python中键入check的一种可怕,可怕的方法.如果另一个类继承自`str`怎么办?unicode字符串怎么样,甚至不从2.x中的`str`继承?在2.x中使用`isinstance(s,basestring)`,或在3.x中使用`isinstance(s,str)`. (7认同)
  • @Jack,请阅读问题,并注意我没有写这是最好的方法,只是另一种方法。 (2认同)

dua*_*nev 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)
Run Code Online (Sandbox Code Playgroud)

在这个函数中,我们isinstance(object, classinfo)用来看看我们的输入是str在Python 3中还是basestring在Python 2中.

  • 这可能会在 Python 4 中中断,至少考虑 `>=`。 (2认同)
  • 更清晰地检查 Six.string_types 或 Six.text_type (2认同)

Pat*_*wak 7

所以,

您有很多选项可以检查您的变量是否为字符串:

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

此订单是出于有目的.


ypr*_*rez 6

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

isinstance(s, (str, unicode))
Run Code Online (Sandbox Code Playgroud)

但是仍然不能在Python 3中工作,因为unicode没有定义(在Python 3中).


be_*_*ood 5

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

isinstance(a, str) or isinstance(a, unicode)
Run Code Online (Sandbox Code Playgroud)

返回True

type(a) in [str, unicode]
Run Code Online (Sandbox Code Playgroud)

返回True


Cas*_*Cas 5

这是我支持 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)
Run Code Online (Sandbox Code Playgroud)