Joa*_*nge 1282 python string comparison-operators
Python是否有类似空字符串变量的地方,你可以这样做:
if myString == string.empty:
Run Code Online (Sandbox Code Playgroud)
无论如何,检查空字符串值的最优雅方法是什么?我""
每次都发现硬编码检查空字符串不太好.
And*_*ark 1889
空字符串是"falsy",这意味着它们在布尔上下文中被视为false,因此您可以这样做:
if not myString:
Run Code Online (Sandbox Code Playgroud)
如果您知道您的变量是字符串,那么这是首选方法.如果您的变量也可以是其他类型,那么您应该使用myString == ""
.有关布尔上下文中为false的其他值,请参阅真值测试文档.
zen*_*poy 378
对于序列,(字符串,列表,元组),请使用空序列为假的事实.
所以你应该使用:
if not some_string:
Run Code Online (Sandbox Code Playgroud)
要么:
if some_string:
Run Code Online (Sandbox Code Playgroud)
只是为了澄清,序列评估到False
或True
在布尔上下文如果它们是空的或不是.他们不等于到False
或True
.
Bar*_*tek 213
最优雅的方式可能是简单地检查它是真的还是假的,例如:
if not my_string:
Run Code Online (Sandbox Code Playgroud)
但是,您可能希望剥离空格,因为:
>>> bool("")
False
>>> bool(" ")
True
>>> bool(" ".strip())
False
Run Code Online (Sandbox Code Playgroud)
你可能应该更明确一点,除非你确定这个字符串已经通过了某种验证,并且是一个可以通过这种方式测试的字符串.
rou*_*ble 77
我会在剥离之前测试一下.另外,我会使用空字符串为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
Run Code Online (Sandbox Code Playgroud)
并且,如果字符串不是测试则完全相反无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
Run Code Online (Sandbox Code Playgroud)
以上代码的更简洁形式:
def isBlank (myString):
return not (myString and myString.strip())
def isNotBlank (myString):
return bool(myString and myString.strip())
Run Code Online (Sandbox Code Playgroud)
vau*_*ult 42
我曾经写过一些类似于Bartek的回答和javascript的启发:
def is_not_blank(s):
return bool(s and s.strip())
Run Code Online (Sandbox Code Playgroud)
测试:
print is_not_blank("") # False
print is_not_blank(" ") # False
print is_not_blank("ok") # True
print is_not_blank(None) # False
Run Code Online (Sandbox Code Playgroud)
Dak*_*ron 17
唯一真正可靠的方法是:
if "".__eq__(myString):
Run Code Online (Sandbox Code Playgroud)
所有其他解决方案都可能存在问题,并且可能导致检查失败。
len(myString)==0
如果myString
是从str
该__len__()
方法继承并覆盖该方法的类的对象,则该方法可能会失败。
同样myString == ""
,myString.__eq__("")
如果myString
覆盖__eq__()
和,则可能失败__ne__()
。
由于某种原因,"" == myString
如果myString
覆盖也将被愚弄__eq__()
。
myString is ""
和"" is myString
等价。如果它们myString
实际上不是字符串而是字符串的子类,则它们都将失败(都将返回False
)。另外,由于它们是身份检查,所以它们起作用的唯一原因是因为Python使用了String Pooling(也称为String Internment),该字符串池在被插入时使用相同的字符串实例(请参见此处:为什么使用'=来比较字符串='或'是否'有时会产生不同的结果?)。并""
从一开始就在CPython中进行实习
身份检查的最大问题是,据我所知,String Internment不规范要插入哪些字符串。这意味着,理论上""
没有必要进行实习,而依赖于实现。
真正不能被愚弄的唯一方法是开头提到的方法:"".__eq__(myString)
。由于此__eq__()
方法明确调用了空字符串的方法,因此不能通过覆盖myString中的任何方法来欺骗它,并且可以与的子类牢固地结合使用str
。
如果对象覆盖了它的__bool__()
方法,那么依靠字符串的虚假性可能也不起作用。
这不仅是理论上的工作,而且实际上可能与实际用法有关,因为我之前看到过框架和库的子类化str
,使用myString is ""
那里可能会返回错误的输出。
而且,is
通常使用字符串比较字符串是一个很糟糕的陷阱,因为它有时会正确运行,而在其他时候则无法正常工作,因为字符串池遵循非常奇怪的规则。
也就是说,在大多数情况下,所有提到的解决方案都可以正常工作。这是大多数学术工作。
小智 13
测试空或空字符串(更短的方式):
if myString.strip():
print("it's not an empty or blank string")
else:
print("it's an empty or blank string")
Run Code Online (Sandbox Code Playgroud)
如果你想区分空字符串和空字符串,我建议使用if len(string)
,否则,我建议使用简单,if string
就像其他人说的那样.关于充满空白字符串的警告仍然适用,所以不要忘记strip
.
小智 7
a = ''
b = ' '
a.isspace() -> False
b.isspace() -> True
Run Code Online (Sandbox Code Playgroud)
小智 7
如果你想检查一个字符串是否完全为空
if not mystring
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为空字符串是假的,但如果字符串只有空格,它将是真的,所以你可能想要
if not mystring.strip()
Run Code Online (Sandbox Code Playgroud)
这个怎么样?也许它不是“最优雅的”,但它似乎非常完整和清晰:
if (s is None) or (str(s).strip()==""): // STRING s IS "EMPTY"...
Run Code Online (Sandbox Code Playgroud)
每次检查空字符串时,我都发现用硬编码“”不好。
这样做:foo == ""
是非常不好的做法。""
是一个神奇的价值。您永远都不应检查魔术值(通常称为魔术数)
您应该做的是与描述性变量名称进行比较。
可能会认为“ empty_string”是一种描述性变量名。不是。
在去做之前,请empty_string = ""
以为您有一个很好的变量名可以比较。这不是“描述性变量名”的含义。
一个好的描述性变量名称基于其上下文。你要想想空字符串什么是。
您正在构建一个表单,用户可以在其中输入值。您要检查用户是否写了什么。
一个好的变量名可能是 not_filled_in
这使得代码非常可读
if formfields.name == not_filled_in:
raise ValueError("We need your name")
Run Code Online (Sandbox Code Playgroud)
您正在解析CSV文件,并希望将空字符串解析为 None
(由于CSV完全基于文本,因此如果不None
使用预定义的关键字就无法表示)
一个好的变量名可能是 CSV_NONE
如果您有一个新的CSV文件,该文件None
用另一个字符串表示,则使代码易于更改和调整。""
if csvfield == CSV_NONE:
csvfield = None
Run Code Online (Sandbox Code Playgroud)
毫无疑问,这段代码是否正确。很明显,它做了应该做的事情。
比较一下
if csvfield == EMPTY_STRING:
csvfield = None
Run Code Online (Sandbox Code Playgroud)
这里的第一个问题是,为什么空字符串应该得到特殊对待?
这将告诉以后的编码人员,应该始终将空字符串视为None
。
这是因为它将业务逻辑(CSV值应为None
)与代码实现(我们实际比较的是什么)混合在一起
两者之间需要分开关注。
我对 ''、' '、'\n' 等字符串做了一些实验。我希望 isNotWhitespace 为 True 当且仅当变量 foo 是一个至少包含一个非空白字符的字符串。我正在使用Python 3.6。这就是我最终得到的结果:
isWhitespace = str is type(foo) and not foo.strip()
isNotWhitespace = str is type(foo) and not not foo.strip()
Run Code Online (Sandbox Code Playgroud)
如果需要,请将其包装在方法定义中。