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

if myString == string.empty:

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


当前回答

我发现每次检查空字符串的硬编码(sic)“”都不太好。

清洁代码方法

这样做:foo==“”是非常糟糕的做法。“”是一个神奇的值。你不应该检查魔法值(更常见的是魔法数字)

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

描述性变量名称

人们可能认为“empty_string”是一个描述性变量名称。它不是。

在你去做empty_string=“”并认为你有一个很好的变量名来比较之前。这不是“描述性变量名”的意思。

一个好的描述性变量名是基于其上下文的。你必须考虑空字符串是什么。

它从哪里来。为什么在那里。为什么你需要检查它。

简单表单字段示例

您正在构建一个用户可以输入值的表单。你想检查用户是否写了什么。

一个好的变量名可能是not_fill_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)和代码实现(我们实际比较的是什么)

这两者之间需要分开关注。

其他回答

最清晰的方法是:

if s == "":

优点:

向编程器提供应为什么类型的附加指示。“”不是“硬编码”,它是一个神奇的值,比x==0更大。有些值是基本的,不需要命名常量;例如,x%2以检查偶数。不能错误地指示任何错误值(例如[])为空字符串。


考虑如何检查整数是否为0:

if x == 0:

人们当然不应该这样做:

if not x:

整数和字符串都是基元值类型。为什么要区别对待他们?

not str(myString)

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

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

if not myString:

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

if myString == "":

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

您可能会看到Python中的“分配空值或字符串”

这是关于比较空字符串的。因此,你可以测试你的字符串是否等于空字符串,而不是用not测试空字符串。。。

我对“”、“”和“\n”等字符串进行了一些实验。当且仅当变量foo是至少包含一个非空白字符的字符串时,我希望isNotWhitespace为True。我使用的是Python 3.6。以下是我的结论:

isWhitespace = str is type(foo) and not foo.strip()
isNotWhitespace = str is type(foo) and not not foo.strip()

如果需要,将其包装在方法定义中。