我有一个函数,它将根据函数中的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)
答案 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)