如何检查字符串是否为空?
Python是否有类似于空字符串变量的东西,你可以做。
if myString == string.empty:
无论如何,检查空字符串值的最优雅方式是什么?我发现每次硬编码""
来检查空字符串的效果并不理想。
1271
20
Python是否有类似于空字符串变量的东西,你可以做。
if myString == string.empty:
无论如何,检查空字符串值的最优雅方式是什么?我发现每次硬编码""
来检查空字符串的效果并不理想。
空字符串是"falsy",这意味着它们在布尔语境中被视为假的,所以你可以直接这样做。
如果你知道你的变量是一个字符串,这是首选方法。 如果你的变量也可能是其他类型,那么你应该使用
myString == ""
。 关于其他在布尔语境中为假的值,请参见真值测试的文档。来自PEP 8,在"编程建议 "部分。
所以你应该使用。
或。
澄清一下,在布尔语境中,如果序列是空的或者不是空的,那么序列就会被评价为
False'或者
True'。它们不等于**为 "False "或 "True"。最优雅的方法可能是简单地检查它是真的还是假的,例如。
然而,你可能想剥离白色空间,因为。
不过,你可能应该在这方面更明确一些,除非你确定这个字符串已经通过了某种验证,是一个可以用这种方式测试的字符串。
我会在剥离前测试非性。 另外,我会利用空字符串是False(或Falsy)这一事实。 这种方法类似于[Apache's StringUtils.isBlank][1]或[Guava's Strings.isNullOrEmpty][2]。
这是我用来测试一个字符串是否为None或Empty或Blank的方法:。
而且,正好相反,可以测试一个字符串是否不是None NOR Empty NOR Blank:。
以上代码的更多简洁形式:。
[1]: https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isBlank-java.lang.CharSequence- [2]: https://google.github.io/guava/releases/19.0/api/docs/com/google/common/base/Strings.html#isNullOrEmpty(java.lang.String)
我曾经写过类似于Bartek'的答案和javascript的启发。
测试。
真正靠谱的方法只有以下几种。
所有其他的解决方案都有可能出现问题,并且在边缘情况下检查可能失败。
len(myString)==0
可能会失败,如果myString
是一个继承自str
并覆盖__len__()
方法的类的对象。类似的
myString == ""
和myString.__eq__("")
如果myString
覆盖了__eq__()
和__ne__()
,则myString.__eq__()
会失败。由于某些原因
"" == 如果
myString覆盖了
eq(),
myString`也会被愚弄。myString is ""
和"" is myString
是等价的。 如果myString
实际上不是一个字符串,而是字符串的子类,它们都会失败(都会返回False
)。 另外,由于它们是身份检查,它们工作的唯一原因是Python使用了String Pooling(也叫String Internment),如果一个字符串被实习,它就会使用同一个实例(见这里。 https://stackoverflow.com/questions/1504717/why-does-comparing-strings-using-either-or-is-sometimes-produce-a-differe)。) 而在CPython中,""
从一开始就被实习了。身份检查的最大问题是String Internment的问题(据我所知),它并没有标准化哪些字符串被实习。 也就是说,理论上
""
是没有必要被实习的,这取决于实现。真正不能被忽悠的只有开头提到的那个方法。
"".__eq__(myString)
。 由于这个显式调用了空字符串的__eq__()
方法,所以不能通过覆盖myString中的任何方法来忽悠,而是扎扎实实地用str
的子类来工作。另外,如果对象覆盖了它的
__bool__()
方法,那么依靠字符串的虚假性可能就不行了。这不仅是理论上的工作,而且在实际使用中可能会有关系,因为我以前见过框架和库子化
str
,使用myString is ""
可能会在那里返回一个错误的输出。此外,一般来说,使用
is
比较字符串是一个非常邪恶的陷阱,因为它有时会正确工作,但在其他时候却不正确,因为字符串池遵循非常奇怪的规则。也就是说,在大多数情况下,所有提到的解决方案都会正确工作。 这个帖子主要是学术工作。
测试空或空白字符串(更短的方式)。
如果你想区分空字符串和空字符串,我建议使用
if len(string)
,否则,我'会建议像其他人说的那样简单地使用if string
。 不过关于字符串充满空格的注意事项仍然适用,所以不要忘记strip
。if stringname:
当字符串为空时,会给出一个false
。 我想不能再简单了吧'。清洁代码的方法
这样做。
foo == ""
是非常不好的做法。""
是一个神奇的值。 你永远不应该对魔法值进行检查(更常见的是[魔法数字][1])。你应该做的是与描述性变量名进行比较。
描述性变量名
人们可能会认为,"empty_string"。 是一个描述性的变量名称。 它不是。
在你去做
empty_string = ""
,并认为你有一个很好的变量名来比较。 这不是"描述性变量名" 的意思。一个好的描述性变量名是基于其上下文的。 你必须思考空字符串的**是什么。
简单的表格字段示例
你正在建立一个用户可以输入值的表单。 你想检查用户是否写了一些东西,一个好的变量名称可能是
not_filled_in
。一个好的变量名称可能是
not_filled_in
。这使得代码非常可读
彻底的CSV解析示例。
您正在解析CSV文件,希望将空字符串解析为 "无"。
(由于CSV完全是基于文本的,所以如果不使用预定义的关键字,就无法表示 "无")
一个好的变量名称可能是
CSV_NONE
。如果您有一个新的CSV文件,用另一个比"""`更多的字符串表示 "None",这使得代码很容易改变和适应。
关于这段代码是否正确,没有任何问题。 很明显,它做了它应该做的事情。
将此与
这里的第一个问题是,为什么空字符串值得特殊对待?
这将告诉未来的编码者,空字符串应该总是被认为是
None
。这是因为它混淆了业务逻辑(什么CSV值应该是
None
)和代码实现(我们到底要比较什么)。两者之间需要有一个[分离关注][2]。
[1]: https://en.wikipedia.org/wiki/Magic_number_(编程) [2]: https://en.wikipedia.org/wiki/Separation_of_concerns
这个怎么样? 也许它"不是"最优雅的",但它看起来相当完整和清晰。
回应@1290。 对不起,没有办法在注释中格式化块。
None
值在Python中不是空字符串,(空格)也不是。 安德鲁-克拉克的答案才是正确的。if not myString
. 来自@rouble的答案是针对具体应用的,并没有回答OP'的问题。 如果你对什么是"空白".字符串采用一个奇特的定义,你就会遇到麻烦。 字符串的定义,就会有麻烦。 特别是,标准行为是str(None)
产生'None'
,一个非空白字符串。然而如果你必须把
None
和(空格)当作"空白" 字符串,这里有一个更好的方法。例子: {{{12536373}}
满足@rouble的要求,同时不破坏字符串的预期
bool
行为。我觉得这样做很优雅,因为它可以确保它是一个字符串,并检查它的长度。
另一个简单的方法是定义一个简单的函数。
如果你只用
不能将布尔值 "False "变量与空字符串"''`"相区别。
但是,如果你在脚本中添加一个简单的条件,就会有不同的效果。
如果这对某人有用,这里是我建立的一个快速函数,用于在 list of list (python 2) 中用 N/A 替换空白字符串。
这对于将列表的列表发布到一个不接受某些字段(在模式中标记为NN的字段。 在我的例子中,这是由于一个复合主键)。)
对于那些期待像apache [StringUtils.isBlank][1] 或Guava [Strings.isNullOrEmpty][2] 这样的行为的人来说。
[1]: http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#isBlank(java.lang.CharSequence) [2]: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Strings.html#isNullOrEmpty(java.lang.String)
当你在逐行读取文件时,想确定哪一行是空的,请确保你会使用
.strip()
,因为在"empty"中有新的行字符。 行中有新的行字符。