使用urllib2时,最新版本允许在调用urlopen时使用可选参数“context”。
我整理了一些代码来使用它:
# For Python 3.0 and later
from urllib.request import urlopen, HTTPError, URLError
except ImportError:
# Fall back to Python 2's urllib2
from urllib2 import urlopen, HTTPError, URLError
import ssl
context = ssl.create_default_context()
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
response = urlopen(url=url, context=context)
用我的python 2.78运行它......我得到了:
Traceback (most recent call last):
File "test.py", line 5, in <module>
context = ssl.create_default_context()
AttributeError: 'module' object has no attribute 'create_default_context'
所以我想:让我们去python3吧;现在我明白了:
Traceback (most recent call last):
File "test.py", line 15, in <module>
response = urlopen(url=url, context=context)
TypeError: urlopen() got an unexpected keyword argument 'context'
我花了一些时间来确定使用那个命名参数上下文...还需要比我的ubuntu 14.04上安装的3.4.0更新版本的python。
我的问题:在调用urlopen时,检查“context”是否可用的“规范”方法是什么?只是调用它并期待TypeError?或者对我正在运行的python进行精确的版本检查?
我在这里搜索并使用谷歌,但也许我只是错过了正确的搜索词...因为我找不到任何有用的东西......
答案 0 :(得分:2)
如何检查功能的签名在此处描述:How can I read a function's signature including default argument values?
但是,某些功能具有以下通用签名:
def myfunc(**kwargs):
print kwargs.items()
if kwargs.has_key('foo'):
...
if kwargs.has_key('bar'):
...
在调用它们之前无法知道它们使用了哪些参数。例如,matplotlib
/ pylab
使用kwargs
包含许多此类函数。
答案 1 :(得分:2)
使用try / except。请参阅python glossary:
<强> EAFP 强>
比获得许可更容易请求宽恕。这种常见的Python编码风格假设存在有效的键或属性,并且如果假设被证明是错误则捕获异常。这种干净和快速的风格的特点是存在许多try和except语句。该技术与许多其他语言(如C。
)共有的LBYL风格形成对比
答案 2 :(得分:1)
检查Python的版本:
import sys
if sys.hexversion >= 0x03050000:
urlopen = urllib.urlopen
else:
def urlopen (*args, context=None, **kwargs):
return urllib.urlopen(*args, **kwargs)
现在只需使用urlopen()
代替urllib.urlopen()
。
我认为这会在3.5的早期alphas中打破,但alphas意味着打破,所以我不在乎追踪引入这个论点的精确版本。