检查字符串中是否存在多个子字符串的pythonic方法是什么?
例如。我正在进行民意调查并通过API检查下载状态。 API将状态返回为“下载完成”,“x%已下载”或“正在安装”。
现在,我想检查API返回的状态是否存在“已下载”和“安装”字符串,如果没有,则引发异常。我已经通过非常新手的方式实现了这一点。
if api_object.status == 'Download Complete' :
break
elif 'Downloaded' in api_object.status.split():
time.sleep(interval)
elif 'Downloaded' not in api_object.status.split() or \
'Installing' not in api_object.status.split():
raise Exception("Error")
我想知道任何更好的比较方法。
提前致谢。
答案 0 :(得分:2)
稍微紧凑的版本:
if api_object.status == 'Download Complete':
break
elif 'Downloaded' in api_object.status:
time.sleep(interval)
elif 'Installing' not in api_object.status:
raise Exception("Error")
答案 1 :(得分:0)
我不知道你的代码是否是“pythonic”,但它很容易理解,这是最重要的,即使它有点长。检查以下“更多pythonic”方式:
....
elif all([(x not in status) for x in ['Downloaded', 'Installing'] ]):
....
读得更好吗?
答案 2 :(得分:0)
怎么样:
status = api_object.status.partition(" ");
try:
action = {
"Downloaded": doA
"Complete": doB
"Installing": doC
}[status[2] or status[0]]
except KeyError:
# unknown status
raise
action();
使用dict是python中常见的习惯用法,用于替换丢失的switch语句。 doA到doC应该是callables,你在最后一行调用。使用partition(sep)方法和or
运算符,可以轻松选择字符串的正确部分:如果存在,则获取空间后面的部分,否则获取整个字符串。
但是应该注意,缓存字典可能对性能关键应用程序很有用,可以安全地散列密钥和构建字典。
对于不区分大小写的匹配,可以在状态字符串上调用lower()(在分区之前)并将键放在小写字母上。
在这种特殊情况下,需要break
。可以通过允许callable返回一个布尔值来实现这一点,如果True
,则触发break
或类似的方法。
答案 3 :(得分:0)
这是我的代码:
if 'Download Complete' == api_object.status:
break
if 'Installing' == api_object.status:
continue
if api_object.status and api_object.status.endswith('Downloaded'):
time.sleep(interval)
else:
raise Exception("Error")