我使用urllib2向带有参数的服务器发送GET和POST请求,但对于某些请求,我不需要知道服务器的响应,除了它&# 39;不是404,而urlopen在404s上抛出异常。但是,如果我只使用这行:
urllib2.urlopen(address, params)
服务器看不到请求。好像它永远不会被发送一样。但是,如果我那么做
response = urllib2.urlopen(address, params)
命令通过。我查看了urllib2的源代码,找到了urlopen的函数,如下所示:
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
...
return _opener.open(url, data, timeout)
当我不存储urlopen的输出时,似乎没有运行_opener.open
函数。如果我没有要求函数的输出,python是否只是不执行return语句?
答案 0 :(得分:3)
不,函数的行为不会因为是否更改而存储对返回值的引用,或者只是忽略它。在存储或忽略返回值之前,执行该函数。如果函数调用导致引发异常,则根本就没有返回值。
您对发生的事情的分析是不正确的,问题出在其他地方。
你可以自己轻松测试一下:
>>> def foo():
... print "foo() called"
...
>>> def bar():
... return foo()
...
>>> bar()
foo() called
>>> result = bar()
foo() called
或使用urllib2.urlopen()
本身,使用http://httpbin.org/status/404
触发404 Not Found响应:
>>> import urllib2
>>> response = urllib2.urlopen('http://httpbin.org/status/404')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 127, in urlopen
return _opener.open(url, data, timeout)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 410, in open
response = meth(req, response)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 523, in http_response
'http', request, response, code, msg, hdrs)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 448, in error
return self._call_chain(*args)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 382, in _call_chain
result = func(*args)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 531, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: NOT FOUND
>>> urllib2.urlopen('http://httpbin.org/status/404')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 127, in urlopen
return _opener.open(url, data, timeout)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 410, in open
response = meth(req, response)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 523, in http_response
'http', request, response, code, msg, hdrs)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 448, in error
return self._call_chain(*args)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 382, in _call_chain
result = func(*args)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib2.py", line 531, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: NOT FOUND
这两个行动都会引发异常。
答案 1 :(得分:0)
无论您是否使用返回值
,Python都将始终执行return语句