Pythonic方式检查和民意调查机制

时间:2012-03-16 07:23:54

标签: if-statement python

检查字符串中是否存在多个子字符串的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")

我想知道任何更好的比较方法。

提前致谢。

4 个答案:

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