Python 2/3兼容的方法在* args之后生成默认参数

时间:2017-11-24 15:53:11

标签: python python-3.x python-2.7 compatibility

有没有办法保持Python 3语法在*args之后调用默认参数,同时仍然与Python 2兼容?

我有这样的功能:

def foo(*args, bar='test'):
    pass  # do stuff with args and bar

问题是模块需要兼容Python 2和3,因此*args之后的默认参数不起作用。我看过this answer,建议做

def foo(*args, **kwargs):
    bar = kwargs.pop('bar', 'test')
    # do stuff with args and bar

哪个有效,但无可否认不如第一种方法清晰。关于第一种方法的好处是它是部分自我记录的,而对于第二种方法,用户必须搜索一下以找出正在发生的事情。 可读性计算

那么,有没有一种方法可以至少在模块中使用第一种方法,同时仍然在Python 2.7上运行代码?例如,可能写两次函数定义,一次用于Py2,一次用于Py3?

1 个答案:

答案 0 :(得分:0)

不,你不能在Python 2解释器使用的文件中使用Python 3表单。这是因为*args之后放置的仅关键字参数是对Python语法的更改,因此在您接近执行代码之前,它将导致Python 2中出现语法错误。

您必须在两种情况下都使用Python 2版本,或者使用单独的源文件并仅导入正确的源文件。