对 Python 中的 If、continue 和 else 的结果感到困惑
Posted
技术标签:
【中文标题】对 Python 中的 If、continue 和 else 的结果感到困惑【英文标题】:Baffled by the outcome of If, continue, and else in python 【发布时间】:2018-12-06 01:56:30 【问题描述】:这是有问题的代码:
data = requests.get(searchURL, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False)
feed_data = data.content
d = feedparser.parse(feed_data)
tickets=[]
for ticketNum in d['entries'] :
tickets.append(ticketNum['title'])
s = requests.Session()
s.get(ticketsBaseUrl, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False)
for ticket in tickets :
ticket_page = s.get(ticketsBaseUrl+ticket, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False )
if ticket_page.status_code == 404 :
print('ticket %s data 404, skipping' %ticket)
continue
现在这段代码本身会导致 404 响应的预期 3 次跳过。
但是,当我添加一个 else 时:
data = requests.get(searchURL, auth=HTTPBasicAuth(config.flxusername,
config.flxpassword), verify=False)
feed_data = data.content
d = feedparser.parse(feed_data)
tickets=[]
for ticketNum in d['entries'] :
tickets.append(ticketNum['title'])
s = requests.Session()
s.get(ticketsBaseUrl, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False)
for ticket in tickets :
ticket_page = s.get(ticketsBaseUrl+ticket, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False )
if ticket_page.status_code == 404 :
print('ticket %s data 404, skipping' %ticket)
continue
else :
etree = ET.fromstring(ticket_page.content)
print(etree)
最后的 404 页面内容被传递给 etree 并且脚本出错了。
当我只执行 else: print(ticket_page.status_code) 时,它会打印 3 条错误消息,其余的会打印 200 条。当我放入 etree 块时,它才开始尝试解析最终的 404。真让人抓狂。
我在这里缺少什么?
尝试了另一种选择:
data = requests.get(searchURL, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False)
feed_data = data.content
d = feedparser.parse(feed_data)
tickets=[]
for ticketNum in d['entries'] :
tickets.append(ticketNum['title'])
s = requests.Session()
s.get(ticketsBaseUrl, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False)
for ticket in tickets :
ticket_page = s.get(ticketsBaseUrl+ticket, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False )
if ticket_page.status_code == 404 :
print('ticket %s data 404, skipping' %ticket)
continue
etree = ET.fromstring(ticket_page.content)
这也不会跳过最后的 404。
测试了一个较小的代码段:
if ticket_page.status_code == 404 :
print(str(ticket_page.status_code) + ' ' + ticket)
continue
else :
print(ET.fromstring(ticket_page.content))
失败;试图从列表中的最后一个 404 中提取字符串。
if ticket_page.status_code == 404 :
print(str(ticket_page.status_code) + ' ' + ticket)
continue
else :
print('continued')
工作,打印 3 404 并继续打印其他所有内容。 (这在技术上不正确;它实际上处理了其他所有内容)
反其道而行之:
if ticket_page.status_code == 200:
print(ET.fromstring(ticket_page.content))
else :
print(str(ticket_page.status_code) + ' ' + ticket)
continue
if ticket_page.status_code != 200:
print(str(ticket_page.status_code) + ' ' + ticket)
continue
else :
print(ET.fromstring(ticket_page.content))
if ticket_page.status_code != 200:
print(str(ticket_page.status_code) + ' ' + ticket)
continue
print(ET.fromstring(ticket_page.content))
同样的结果。在最后的 404 上仍然失败
甚至
for ticket in tickets :
ticket_page = s.get(ticketsBaseUrl+ticket, auth=HTTPBasicAuth(config.flxusername, config.flxpassword), verify=False )
if ticket_page.status_code != 200:
tickets.pop()
在列表中留下 404。
这是引发解析错误的 XML:
b'<?xml version="1.0" standalone="yes"?>\n\n<error><statusCode>404</statusCode><name>Not Found</name><description>The server has not found anything matching the request URI: Ticket not found</description></error>\n\n'
最新测试:
if 'statusCode' in tree_root.decode() :
print(ticket)
continue
这给了我 3 张预期的票。
if 'statusCode' in tree_root.decode() :
print(ticket)
continue
etree = ET.fromstring(ticket_page.content.decode())
print(etree)
这在第 3 次 404 票证上失败。添加延迟,认为这是因为在最终 404 之前有大量 200 造成的,但并没有改变结果。
【问题讨论】:
请重新检查/修复显示的缩进。第一个代码块肯定是错误的(会引发SyntaxError
),第二个代码块中else
上的缩进真的很重要;如果它有一点点错误,不小心,代码会做完全不同的事情。
你好,你能分享一下门票清单中的例子吗?您收到哪 3 条错误消息?
票只是一个列表,其中包含要传递给票库 URL 的 GUID,例如 00000e03-c06e-4417-985b-0437bc40b5d7,它要么返回 200 和一些 XML 内容,要么返回 404 和类似 XML 的内容,但不被库识别为 XML。所以我试图跳过阅读 404 页的尝试。
啊,是的,我看到缩进上发生了什么,让我解决它;它在我的脚本中。
Haramoz 3 404's 当我发出简单打印时,如果 404 是:404 00000e03-c06e-4417-985b-1faae4955e13 404 0000179c-2efc-4001-8bd8-0437bc40b5d-2017 404-4084-400699 -5bd0eb2f46e3 当我在 IF 之后添加任何其他内容时,它会尝试处理最后一个。
【参考方案1】:
答案如下:
检查所有 200 个;导致问题的不是 404。 200 个中的一个有错误的 XML。我发布的大多数变体都能正常工作。我在抽查我的 200 个,每一次抽查我都错过了一个带有错误 XML 的抽查。我想出了如何处理错误的 XML 并且能够完成。
【讨论】:
以上是关于对 Python 中的 If、continue 和 else 的结果感到困惑的主要内容,如果未能解决你的问题,请参考以下文章
Python:为啥 if-else 一行语句在 else 中不能与 continue 一起使用?