python函数是否关心你是否使用它们的输出?

时间:2014-06-12 14:23:47

标签: python python-2.7 urllib2

我使用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语句?

2 个答案:

答案 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语句