如何检查字符串是否为空?

Python 是否有类似空字符串变量的内容可以在其中执行:

if myString == string.empty:

无论如何,检查空字符串值的最优雅方法是什么?我发现每次都很难对空字符串进行硬编码""

答案

空字符串是“虚假的” ,这意味着它们在布尔上下文中被认为是错误的,因此您可以执行以下操作:

if not myString:

如果您知道变量是字符串,则这是首选方法。如果您的变量也可以是其他类型,则应使用myString == "" 。有关在布尔上下文中为假的其他值,请参见 “ 真值测试 ” 文档。

PEP 8“编程建议” 部分中

对于序列(字符串,列表,元组),请使用空序列为假的事实。

因此,您应该使用:

if not some_string:

要么:

if some_string:

为了明确起见,如果序列为空或不为空,则它们在布尔上下文中被评估FalseTrue 。它们不等于 FalseTrue

最优雅的方法可能是简单地检查其真实性或虚假性,例如:

if not my_string:

但是,您可能要删除空格,因为:

>>> bool("")
 False
 >>> bool("   ")
 True
 >>> bool("   ".strip())
 False

但是,您可能应该对此更加明确,除非您确定该字符串已通过某种验证并且可以通过这种方式进行测试。

我会在剥离之前测试无。另外,我会使用一个空字符串为 False(或 Falsy)的事实。这种方法类似于Apache 的 StringUtils.isBlank番石榴的 Strings.isNullOrEmpty

这就是我用来测试字符串是否为 None 或 Empty 或 Blank 的内容:

def isBlank (myString):
    if myString and myString.strip():
        #myString is not None AND myString is not empty or blank
        return False
    #myString is None OR myString is empty or blank
    return True

并且,与测试字符串是否不是 None 或 NOR 空或 NOR 空白完全相反:

def isNotBlank (myString):
    if myString and myString.strip():
        #myString is not None AND myString is not empty or blank
        return True
    #myString is None OR myString is empty or blank
    return False

上面代码的更简洁形式:

def isBlank (myString):
    return not (myString and myString.strip())

def isNotBlank (myString):
    return bool(myString and myString.strip())

我曾经写过类似 Bartek 的答案和 javascript 启发的东西:

def is_not_blank(s):
    return bool(s and s.strip())

测试:

print is_not_blank("")    # False
print is_not_blank("   ") # False
print is_not_blank("ok")  # True
print is_not_blank(None)  # False

唯一真正可靠的方法是:

if "".__eq__(myString):

所有其他解决方案都可能存在问题,并且可能导致检查失败。

如果myString是从str继承并覆盖__len__()方法的类的对象,则len(myString)==0可能会失败。

同样,如果myString覆盖__eq__()__ne__() myString == ""myString.__eq__("")可能会失败。

由于某种原因,如果myString覆盖__eq__() "" == myString也将被愚弄。

myString is """" is myString是等效的。如果myString实际上不是字符串而是字符串的子类(它们都将返回False ),它们都将失败。另外,由于它们是身份检查,所以它们起作用的唯一原因是因为 Python 使用了 String Pooling(也称为 String Internment),该字符串池在被插入时使用相同的字符串实例(请参见此处: 为什么使用 '= 来比较字符串 =' 或 '是否' 有时会产生不同的结果? )。而""从一开始就在 CPython 中被嵌入

身份检查的最大问题是,据我所知,String Internment 不规范要插入哪些字符串。这意味着,理论上""不是必需的,而是依赖于实现的。

真正不能被愚弄的唯一方法是开头提到的方法: "".__eq__(myString) 。由于此方法显式调用了空字符串的__eq__()方法,因此不能通过覆盖 myString 中的任何方法来欺骗它,并且可以与str子类牢固地配合使用。

如果对象覆盖了它的__bool__()方法,那么也不能依靠字符串的虚假性来工作。

这不仅是理论上的工作,而且实际上可能与实际用法有关,因为我之前看到框架和库将str子类化,并且使用myString is ""可能会在此处返回错误的输出。

另外,比较使用字符串is一般是一个非常邪恶的陷阱,因为它会正常工作有时,但不是在其他时间,因为字符串池下面很奇怪的规则。

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

测试空字符串或空字符串(较短的方法):

if myString.strip():
    print("it's not an empty or blank string")
else:
    print("it's an empty or blank string")

如果要区分空字符串和空字符串,我建议使用if len(string) ,否则,我建议仅使用if string就像其他人所说的那样。关于充满空格的字符串的警告仍然适用,因此请不要忘记strip

a = ''
b = '   '
a.isspace() -> False
b.isspace() -> True

每次检查空字符串时,我都发现用硬编码 “” 不好。

干净的代码方法

这样做: foo == ""是非常不好的做法。 ""是一个神奇的价值。您永远都不应检查魔术值(通常称为魔术数

您应该做的是与描述性变量名称进行比较。

描述性变量名称

可能会认为 “empty_string” 是一种描述性变量名。 不是

在您开始执行empty_string = ""并认为您有一个很好的变量名称要比较时,再进行操作。这不是 “描述性变量名” 的含义。

一个好的描述性变量名称基于其上下文。你要想想空字符串什么。

  • 它从何而来。
  • 为什么在那儿。
  • 为什么需要检查它。

简单表单字段示例

您正在构建一个表单,用户可以在其中输入值。您要检查用户是否写了什么。

一个好的变量名可能不是not_filled_in

这使得代码非常可读

if formfields.name == not_filled_in:
    raise ValueError("We need your name")

全面的 CSV 解析示例

您正在解析 CSV 文件,并希望将空字符串解析为None

(由于 CSV 完全基于文本,因此如果不使用预定义的关键字,它就不能表示None

好的变量名称可能是CSV_NONE

如果您有一个新的 CSV 文件,该文件表示 “ None且字符串以外的其他字符串"" ,则可以轻松更改和修改代码

if csvfield == CSV_NONE:
    csvfield = None

毫无疑问,这段代码是否正确。很明显,它做了应该做的事情。

比较一下

if csvfield == EMPTY_STRING:
    csvfield = None

这里的第一个问题是,为什么空字符串应该得到特殊对待?

这将告诉以后的编码人员,应该始终将空字符串视为None

这是因为它将业务逻辑(CSV 值应为None )与代码实现(我们实际比较的是什么)混合在一起

两者之间需要分开关注