Python是否有类似于空字符串变量的东西,你可以做。
if myString == string.empty:
无论如何,检查空字符串值的最优雅方式是什么?我发现每次硬编码""
来检查空字符串的效果并不理想。
空字符串是"falsy",这意味着它们在布尔语境中被视为假的,所以你可以直接这样做。
if not myString:
如果你知道你的变量是一个字符串,这是首选方法。 如果你的变量也可能是其他类型,那么你应该使用myString == ""
。 关于其他在布尔语境中为假的值,请参见真值测试的文档。
我会在剥离前测试非性。 另外,我会利用空字符串是False(或Falsy)这一事实。 这种方法类似于[Apache's StringUtils.isBlank][1]或[Guava's Strings.isNullOrEmpty][2]。
这是我用来测试一个字符串是否为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 Empty NOR Blank:。
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())
[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)
真正靠谱的方法只有以下几种。
if "".__eq__(myString):
所有其他的解决方案都有可能出现问题,并且在边缘情况下检查可能失败。
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
比较字符串是一个非常邪恶的陷阱,因为它有时会正确工作,但在其他时候却不正确,因为字符串池遵循非常奇怪的规则。
也就是说,在大多数情况下,所有提到的解决方案都会正确工作。 这个帖子主要是学术工作。
我发现硬编码(原文如此)""。 每次检查一个空字符串的时候,都没有那么好。
这样做。
foo == ""
是非常不好的做法。
""
是一个神奇的值。
你永远不应该对魔法值进行检查(更常见的是[魔法数字][1])。
你应该做的是与描述性变量名进行比较。
人们可能会认为,"empty_string"。 是一个描述性的变量名称。 它不是。
在你去做empty_string = ""
,并认为你有一个很好的变量名来比较。
这不是"描述性变量名"
的意思。
一个好的描述性变量名是基于其上下文的。 你必须思考空字符串的**是什么。
你正在建立一个用户可以输入值的表单。
你想检查用户是否写了一些东西,一个好的变量名称可能是not_filled_in
。
一个好的变量名称可能是not_filled_in
。
这使得代码非常可读
if formfields.name == not_filled_in:
raise ValueError("We need your name")
您正在解析CSV文件,希望将空字符串解析为 "无"。
(由于CSV完全是基于文本的,所以如果不使用预定义的关键字,就无法表示 "无")
一个好的变量名称可能是CSV_NONE
。
如果您有一个新的CSV文件,用另一个比"""`更多的字符串表示 "None",这使得代码很容易改变和适应。
if csvfield == CSV_NONE:
csvfield = None
关于这段代码是否正确,没有任何问题。 很明显,它做了它应该做的事情。
将此与
if csvfield == EMPTY_STRING:
csvfield = 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
和(空格)当作"空白"
字符串,这里有一个更好的方法。
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())
例子: {{{12536373}}
>>> 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的要求,同时不破坏字符串的预期bool
行为。
如果这对某人有用,这里是我建立的一个快速函数,用于在 list of list (python 2) 中用 N/A 替换空白字符串。
y = [["1","2",""],["1","4",""]]
def replace_blank_strings_in_lists_of_lists(list_of_lists):
new_list = []
for one_list in list_of_lists:
new_one_list = []
for element in one_list:
if element:
new_one_list.append(element)
else:
new_one_list.append("N/A")
new_list.append(new_one_list)
return new_list
x= replace_blank_strings_in_lists_of_lists(y)
print x
这对于将列表的列表发布到一个不接受某些字段(在模式中标记为NN的字段。 在我的例子中,这是由于一个复合主键)。)
对于那些期待像apache [StringUtils.isBlank][1] 或Guava [Strings.isNullOrEmpty][2] 这样的行为的人来说。
if mystring and mystring.strip():
print "not blank string"
else:
print "blank string"
[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)