If statement 检查和轮询机制的Pythonic方法

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

检查字符串中是否存在多个子字符串的Python方法是什么

例如,我正在通过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")
我想知道更好的比较方法


提前感谢。

更紧凑的版本:

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")