If statement 检查和轮询机制的Pythonic方法
检查字符串中是否存在多个子字符串的Python方法是什么 例如,我正在通过API对下载状态进行轮询和检查。API返回状态为“下载完成”、“x%已下载”或“正在安装” 现在,我想检查API返回的状态中是否存在“已下载”和“正在安装”字符串,如果不存在,则引发异常。我以非常新手的方式实现了这一点If statement 检查和轮询机制的Pythonic方法,if-statement,python,If Statement,Python,检查字符串中是否存在多个子字符串的Python方法是什么 例如,我正在通过API对下载状态进行轮询和检查。API返回状态为“下载完成”、“x%已下载”或“正在安装” 现在,我想检查API返回的状态中是否存在“已下载”和“正在安装”字符串,如果不存在,则引发异常。我以非常新手的方式实现了这一点 if api_object.status == 'Download Complete' : break elif 'Downloaded' in api_object.status.sp
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")
我想知道更好的比较方法
提前感谢。更紧凑的版本:
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")
我不知道你的代码是不是“pythonic”,但它很容易理解,这是最重要的,即使它稍微长一点。检查以下“更具蟒蛇性”的方式: 它读起来更好吗?那么:
status = api_object.status.partition(" ");
try:
action = {
"Downloaded": doA
"Complete": doB
"Installing": doC
}[status[2] or status[0]]
except KeyError:
# unknown status
raise
action();
在python中,使用dict替换缺少的switch语句是一种常见的习惯用法。doA到doC应该是可调用的,您在最后一行调用它。使用该方法和或
运算符,可以轻松地选择字符串的正确部分:如果存在,则获取空格后面的部分,否则获取整个字符串
不过,应该注意,缓存字典在性能关键型应用程序中可能非常有用,以确保对键进行散列和构建dict的安全时间
对于不区分大小写的匹配,可以调用状态字符串(在分区之前),并将键放在小写
在这种特殊情况下,需要一个中断
。可以通过允许callable返回一个布尔值来实现这一点,如果True
,它将触发中断
或类似的方法。下面是我的代码:
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")
显示您当前的实现将非常有用。这对我来说似乎是合理的,尽管使用
split
是多余的,如Amber下面所示。
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")