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

Python:如何检查是否可以使用可选参数?,python,urllib2,optional-parameters,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

对于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'
回溯(最近一次呼叫最后一次):
文件“test.py”,第5行,在
context=ssl.create\u default\u context()
AttributeError:“模块”对象没有“创建默认上下文”属性
所以我想:那就让我们去喝蟒蛇吧;现在我得到:

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'
回溯(最近一次呼叫最后一次):
文件“test.py”,第15行,在
response=urlopen(url=url,context=context)
TypeError:urlopen()获得意外的关键字参数“context”
我花了一段时间才明白使用命名参数上下文。。。还需要比我的ubuntu 14.04上安装的3.4.0版本更新的python版本

我的问题:在调用urlopen时,检查是否可以使用“上下文”的“规范”方法是什么?只要调用它,就可以预料到类型错误?或者对我运行的python进行精确的版本检查


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

这里介绍了如何检查函数的签名:

但是,有些函数具有通用签名,如:

def myfunc(**kwargs):
    print kwargs.items()

    if kwargs.has_key('foo'):
        ...

    if kwargs.has_key('bar'):
        ...
在调用它们之前,不可能知道它们使用了哪些参数。例如,
matplotlib
/
pylab
使用
kwargs
使用try/except有许多这样的函数。见:

EAFP

请求原谅比允许更容易。这种常见的Python编码风格假设存在有效的键或属性,如果假设为false,则捕获异常。这种简洁快速的风格的特点是有许多尝试和例外的陈述。这种技术与许多其他语言(如C语言)所共有的LBYL风格形成对比


检查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注定要被打破,所以我不太关心引入这一论点的确切版本

虽然你实际上没有这么说,但你的回答只是加强了我的理解;但我有很强的java背景;而且,在精神上,先申请许可要容易得多。我就是受不了提出一个例外的想法。。。我不得不担心将来一些细微的细节会发生变化;我抓错了什么东西。因此,您的答案指出的
inspect.getfullargspec
正是我将要使用的。@Jägermeister:每次您对
循环使用
时,它都以引发然后捕获
停止迭代
结束。您需要习惯在Python中大量使用异常。