【问题标题】:Python 2/3 compatible way to make default arguments after *args在 *args 之后生成默认参数的 Python 2/3 兼容方式
【发布时间】:2017-11-24 15:53:10
【问题描述】:

有没有办法保持 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?

【问题讨论】:

  • 你当然可以编写两次函数,但是如果第二个版本同时适用于 Python 2 和 Python 3,你为什么要这样做?如果您的目标是清晰,那么您将通过拥有两个版本来使您的功能更加清晰。只需对您的功能发表评论会更清晰,更容易。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多