Python是否有类似空字符串变量的功能,您可以在其中执行以下操作:

if myString == string.empty:

无论如何,检查空字符串值最优雅的方法是什么?我发现每次检查空字符串的硬编码“”都不太好。


当前回答

正如prmatta在上面发布的,但有错误。

def isNoneOrEmptyOrBlankString (myString):
    if myString:
        if not myString.strip():
            return True
        else:
            return False
    return False

其他回答

空字符串是“falsy”(python 2或python 3引用),这意味着它们在布尔上下文中被视为false,因此您可以这样做:

if not myString:

如果知道变量是字符串,这是首选方法。如果变量也可以是其他类型,则应使用:

if myString == "":

有关布尔上下文中为假的其他值,请参阅真值测试文档。

正如prmatta在上面发布的,但有错误。

def isNoneOrEmptyOrBlankString (myString):
    if myString:
        if not myString.strip():
            return True
        else:
            return False
    return False

回复@1290。抱歉,无法格式化注释中的块。None值在Python中不是空字符串,也不是(空格)。安德鲁·克拉克的答案是正确的:如果不是myString。@rouble的答案是特定于应用程序的,不会回答OP的问题。如果你对什么是“空白”字符串采用一个特殊的定义,你会遇到麻烦。特别是,标准行为是str(None)生成“None”,一个非空字符串。

但是,如果您必须将None和(空格)视为“空白”字符串,这里有一个更好的方法:

class weirdstr(str):
    def __new__(cls, content):
        return str.__new__(cls, content if content is not None else '')
    def __nonzero__(self):
        return bool(self.strip())

示例:

>>> normal = weirdstr('word')
>>> print normal, bool(normal)
word True

>>> spaces = weirdstr('   ')
>>> print spaces, bool(spaces)
    False

>>> blank = weirdstr('')
>>> print blank, bool(blank)
 False

>>> none = weirdstr(None)
>>> print none, bool(none)
 False

>>> if not spaces:
...     print 'This is a so-called blank string'
... 
This is a so-called blank string

满足@rouble要求,同时不破坏字符串的预期布尔行为。

唯一真正可靠的方法是:

if "".__eq__(myString):

所有其他解决方案都可能存在检查失败的问题和边缘情况。

如果myString是继承自str并重写__len__()方法的类的对象,则len(myString)==0可能失败。myString==“”和myString__如果myString重写__eq__()和__ne__(),则eq__(“”)可能失败。“”==如果myString重写__eq__(),myString也会被愚弄。myString是“”,“”是myString。如果myString实际上不是字符串而是字符串的子类(两者都将返回False),则它们都将失败。此外,由于它们是身份检查,所以它们工作的唯一原因是因为Python使用字符串池(也称为字符串互存),如果字符串被互存,则使用相同的字符串实例(请参见此处:为什么使用“==”或“is”比较字符串有时会产生不同的结果?)。“”从一开始就在CPython实习身份检查的一个大问题是,字符串实习(据我所知)没有标准化哪些字符串被实习。这意味着,理论上“”不是必需的,这取决于实现。此外,使用字符串进行比较通常是一个非常邪恶的陷阱,因为它有时会正常工作,但有时不会,因为字符串池遵循非常奇怪的规则。如果对象重写__bool__(),则依赖字符串的虚假性可能不起作用。

唯一不能被愚弄的方法就是开头提到的“”__eq__(myString)。由于它显式调用空字符串的__eq__()方法,因此不能通过重写myString中的任何方法来欺骗它,并且可以与str的子类一起工作。

这不仅是理论上的工作,实际上可能与实际使用相关,因为我以前见过框架和库将str子类化,并且使用myString is“”可能会返回错误的输出。

也就是说,在大多数情况下,所有提到的解决方案都能正常工作。这主要是学术工作。

not str(myString)

对于空字符串,此表达式为True。非空字符串、None和非字符串对象都将产生False,但需要注意的是,对象可能会重写__str__,通过返回一个falsy值来阻止此逻辑。