如何让列表附加"没有" (非空值)

时间:2015-12-01 06:21:09

标签: python

我有一个函数,它将根据函数中的if语句返回不同的值。返回的值将添加到现有列表中。但是,在函数中有一种情况,我希望函数什么都不做,即现有的列表将保持不变,就好像没有调用函数一样。目前我正在做的是以下内容,但我觉得这看起来很混乱,并且想知道是否有更好的方法:

 $http.post('/py/commandSend',{'sourceIP':'xxx.xxx.xxx.xxx','commandDest':commandDest}).
            success(function(data, status, headers, config) {
                requestId = data.requestId;
                console.log(requestId);
                do{
                    console.log('Request ID sent')
                    $http.post('/py/recvData',{'requestId':requestId}).
                        success(function(data, status, headers, config) {
                            console.log('Data after request ID')
                            console.log(data.output);
                        }).
                        error(function(data, status, headers, config) {
                            console.log(status);
                        });
                }while(data.output != "");
                //}while(false);
            }).
            error(function(data, status, headers, config) {
                console.log(status);
            });
        };

所以基本上我所做的就是不断访问某个网页,读取一些值,然后将值放在一个不断增长的列表中。但是,有时我被阻止(给出了错误代码503),那么我希望我的代码能够休眠一段时间然后继续前进。在我收到503错误代码的情况下,不会返回任何内容,因此增长列表将是相同的。但是当我调用函数时,我不知道如何指定这种情况,所以我只是将返回值设置为None(或者可以是任何值),然后将它们添加到列表中,但是在列表中将它们从中删除那。 (所以我使用append()然后pop()如果代码是503)

3 个答案:

答案 0 :(得分:2)

不是附加值,而是检查503并删除值...

lists.append(value)
if code==503:
   lists.pop()

检查响应是否 503,然后附加值。

if code!=503:
   lists.append(value)

答案 1 :(得分:1)

有很多选择;如果您关心代码,请使用@ TigerhawkT3的解决方案;如果您只需要附加一个值或不附加一个值,您可以例如只需返回None(并对其进行测试),或返回(可能为空)列表,并.extend而不是.append

后一种选择打开了一扇特别简洁(但仍然可读)的代码:

import requests
def myfun(url):
    response=requests.get(url)
    code=response.status_code
    if code==503:
       ## why? time.sleep(3*random.random())
       return []
    else:
       html=response.content()
       return [html['some tag']]

lists=[value for url in [my url pool] for value in myfun(url)]

答案 2 :(得分:0)

在Python中,None用于表示无值。它与其他语言中的NULL相同。

在您的方案中,正确的应用程序是在返回503时添加None

理想情况下,您应该返回None并返回任何错误代码 - 因为我假设您的代码的其余部分应该失败,如果是,则会引发500错误。

一旦您浏览了所有网址,只需过滤掉那些成功的网址;通过这种方式,您可以稍后决定如何处理该数据(例如,单独记录它们或将它们排队等待另一次运行等)。

这是一种不会丢弃" invalids"的方法,只是过滤掉它们:

def myfun(url):
    value = None
    response=requests.get(url)
    code=response.status_code
    if code > 400:
       time.sleep(3*random.random())
       return (value, code)
    else:
       html=response.content()
       value=html['some tag']
    return (value,code)

lists=[]

for url in [my url pool]:
     lists.append(myfun(url))

# you can also do    
lists = [myfun(url) for url in my_url_pool]

successful = filter(lists, key=lambda x: x[0] != None)
blocked = filter(lists, key=lambda x: x[0] == 503)