题 最优雅的方法来检查Python中的字符串是否为空?


Python是否有类似空字符串变量的地方?:

if myString == string.empty:

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


929
2018-03-05 20:09


起源


你可以看看这个 stackoverflow.com/questions/21979604/... - octoback
如果需要,您始终可以创建自己的空字符串变量以用于比较。 - Shule


答案:


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

if not myString:

如果您知道您的变量是字符串,那么这是首选方法。如果您的变量也可以是其他类型,那么您应该使用 myString == ""。请参阅文档 真值测试 对于布尔上下文中为false的其他值。


1368
2018-03-05 20:10



要小心,因为很多其他事情也是假的。 - Ignacio Vazquez-Abrams
我之前从未听说过falsy这个词。这是否意味着它返回false? - Joan Venge
@Joan:它在布尔上下文中计算为false。 - Ignacio Vazquez-Abrams
@Bartek的答案也应该考虑在内。今天受到这种打击,思考django形式所需的验证将照顾空字符串,如 " " 虽然不是。 - k4ml
OP想知道变量是否为空字符串,但您也要输入 if not myString: 阻止如果 myString 是 None, 0, False 所以,如果你不确定是什么类型 myString 是的,你应该使用 if myString == "": 确定它是否为空字符串而不是其他一些虚假值。 - Andrew Clark


PEP 8, 在里面 “编程建议”部分

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

所以你应该使用:

if not some_string:

要么:

if some_string:

只是为了澄清,序列是 评估 至 False 要么 True 如果它们是空的,则在布尔上下文中。他们是 不平等 至 False 要么 True


287
2018-03-05 20:12



太棒了,你包括对PEP的参考! - Felix
请注意,此PEP语句有点不准确:空序列 不假(即, == False), 他们只是 评估 至 False 在布尔上下文中,例如 if。 - MestreLion
@MestreLion - 谢谢,我补充说明了这一点。 - zenpoy
PS:在PEP的辩护中,人们可以争辩说“x是假的“(小写字母 假)已经意味着,而不是意义 x == False。但恕我直言,鉴于目标受众,澄清仍然是受欢迎的。 - MestreLion


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

if not my_string:

但是,您可能希望剥离空格,因为:

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

你可能应该更明确一点,除非你确定这个字符串已经通过了某种验证,并且是一个可以通过这种方式测试的字符串。


155
2018-03-05 20:11





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

这是我用来测试字符串是否为空或空或空白:

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

并且,与测试字符串是否为无相反完全相反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())

54
2017-07-02 14:44



imho这太复杂了 - vault
为什么不 if mystring and not mystring.strip()? - Migol
这个答案是正确的解决方案。它并不太复杂。 - asmaier
对于那些关心此类事物的人来说更简洁: def isBlank(s): return not (s and s.strip()) 和 def isNotBlank(s): return s and s.strip()。 - Carl
选择这种方法的任何人都不了解Python。 - Chris Johnson


我曾经写过类似于Bartek的回答和javascript启发的内容:

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

测试:

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

25
2018-01-16 11:02





测试空或空白字符串(更短的方式):

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

12
2018-05-09 07:45



如果 myString = None,它会引发异常。更好地使用@vault's 回答 - Dominik


如果你想区分空字符串和空字符串,我建议使用 if len(string),否则,我建议简单地使用 if string 正如其他人所说。关于充满空白字符串的警告仍然适用,所以不要忘记 strip


9
2018-03-05 20:20



我不知道为什么你要避免使用“”,除非它以某种方式影响性能,但我更喜欢你对那些数以万计的赞成票的答案,因为它不那么令人困惑。但是,我想指出一个空列表也是假的,显然。 - Shule


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

6
2017-08-07 15:55



在 a 情况不是 True。 a 应至少包含一个字符 str.isspace - abele
是的,这篇文章是错的。我会将其更改为正确,但它根本不再符合问题的答案。 - Ashe


我发现硬编码(sic)“”每次都检查一个空字符串不是那么好。

清洁代码方法

这样做: 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)与代码实现(我们实际比较什么)

需要有一个 分离关注 两者之间。


6
2017-10-04 07:35





if my_string is '':

我没有注意到任何答案中的特定组合。我找了

is ''

在发布之前的答案中。

 if my_string is '': print ('My string is NULL') # **footnote

我认为这就是原始海报试图达到的目标......尽可能接近英语并遵循可靠的编程实践。

if my_string is '':
    print('My string is NULL')
else:
    print(f'My string is {my_string}')

角色的角色我觉得这个解决方案很好。

我注意到 None 已经进入讨论,所以我们进一步加入并进一步压缩:

if my_string is '': print('My string is NULL')
elif my_string is None : print('My string.... isn\'t')
else: print(f'My string is {my_string}')

脚注: PEP添加新关键字Null有多“错误”? Null == ''   在此之前,可以将其隐藏到标准导入中 Null ='' 所以一个人可以拥有最像英语的字符串检查..嗯....

if my_string is not Null:
    print(f'my_string is not Null and is {my_string}')

6
2017-11-22 22:26