2012-03-16 27 views
2

检查字符串中是否存在多个子字符串的pythonic方法是什么?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

这将是有益的,以显示您当前的实现。 – Amber 2012-03-16 07:25:08

+0

@Amber更新了问题。 – Mayur 2012-03-16 07:28:57

+0

这对我来说似乎是合理的,尽管使用'split'是多余的,正如Amber下面所示。 – 2012-03-16 07:32:33

回答

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

我不知道,如果你的代码是“Python化”或不是,但它是很容易理解,这就是最重要的事情,哪怕是一点更长的时间。请检查下面的“更Python”的方式:

.... 
elif all([(x not in status) for x in ['Downloaded', 'Installing'] ]): 
.... 

它读好?

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(); 

使用的字典是Python中常见的成语替换丢失的switch语句。通过doC的doA应该是可以调用的,可以在最后一行中调用。使用partition(sep)方法和or运算符,可以轻松地选取字符串的正确部分:如果存在,则获取该空间后面的部分,否则获取整个字符串。

但应该注意,缓存字典可能会对性能至关重要的应用程序有用,以安全地处理密钥散列和构建字典。

对于不区分大小写的匹配,可以在状态字符串(分区之前)上调用lower()并将键设置为小写。

在这种特殊情况下,需要break。人们可以通过允许可调用函数返回一个布尔值来实现这一点,如果这个值为True,则触发break或类似的方法。

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