Python:如何检查是否可以使用可选参数?

时间:2015-07-12 12:03:32

标签: python urllib2 optional-parameters

使用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进行精确的版本检查?

我在这里搜索并使用谷歌,但也许我只是错过了正确的搜索词...因为我找不到任何有用的东西......

3 个答案:

答案 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意味着打破,所以我不在乎追踪引入这个论点的精确版本。