python - 函数参数中裸星号的目的是什么?

标签 python function python-3.x arguments keyword-argument

我看过这个 SO 问题(这不是重复的):Python bare asterisk in function argument

在 python-3.x 中,您可以在函数参数中添加一个裸 *,这意味着(来自 docs 的引用):

Parameters after “*” or “*identifier” are keyword-only parameters and may only be passed used keyword arguments.

好的,所以,我已经定义了一个函数:

>>> def f(a, b, *, c=1, d=2, e=3):
...     print('Hello, world!')
... 

我只能通过指定关键字来传递cde变量值:

>>> f(1, 2, 10, 20, 30)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() takes 2 positional arguments but 5 were given
>>> f(1, 2, c=10, d=20, e=30)
Hello, world!

问题是:

  • 这种限制/语法糖的动机是什么?
  • 它涵盖哪些用例?
  • 真的用在切换到python3的第三方库中了吗?

一些“现实世界”的例子会有很大帮助。提前致谢。

最佳答案

PEP 3102非常清楚地解释了基本原理:关键是允许函数接受本质上正交的各种“选项”。在定义端和调用端指定这些位置都很尴尬,因为它们没有任何明显的“优先级”可以转化为位置顺序。

在各种库中有很多可以从中受益的函数示例。例如 pandas.read_csv 的调用签名是:

def parser_f(filepath_or_buffer,
                 sep=sep,
                 dialect=None,
                 compression=None,

                 doublequote=True,
                 escapechar=None,
                 quotechar='"',
                 quoting=csv.QUOTE_MINIMAL,
                 skipinitialspace=False,
                 lineterminator=None,

                 header='infer',
                 index_col=None,
                 names=None,
                 prefix=None,
                 skiprows=None,
                 skipfooter=None,
                 skip_footer=0,
                 na_values=None,
                 na_fvalues=None,
                 true_values=None,
                 false_values=None,
                 delimiter=None,
                 converters=None,
                 dtype=None,
                 usecols=None,

                 engine='c',
                 delim_whitespace=False,
                 as_recarray=False,
                 na_filter=True,
                 compact_ints=False,
                 use_unsigned=False,
                 low_memory=_c_parser_defaults['low_memory'],
                 buffer_lines=None,
                 warn_bad_lines=True,
                 error_bad_lines=True,

                 keep_default_na=True,
                 thousands=None,
                 comment=None,
                 decimal=b'.',

                 parse_dates=False,
                 keep_date_col=False,
                 dayfirst=False,
                 date_parser=None,

                 memory_map=False,
                 nrows=None,
                 iterator=False,
                 chunksize=None,

                 verbose=False,
                 encoding=None,
                 squeeze=False,
                 mangle_dupe_cols=True,
                 tupleize_cols=False,
                 infer_datetime_format=False):

除了文件路径之外,其中大多数都是正交选项,用于指定如何解析 CSV 文件的不同方面。没有特别的理由说明它们会以任何特定的顺序通过。你会发疯地跟踪这些的任何位置顺序。将它们作为关键字传递更有意义。

现在,您可以看到 pandas 实际上并没有将它们定义为仅关键字参数,大概是为了保持与 Python 2 的兼容性。我想许多库出于同样的原因避免使用该语法。我不知道哪些库(如果有的话)已经开始使用它。

关于python - 函数参数中裸星号的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23038767/

相关文章:

python - 用 Beautiful soup 解析 Google inner cards

python - 只有 size-1 数组可以转换为 Python 标量

python - 我可以用python下载和分割视频吗?

javascript - Jquery 无冲突 - Onclick 函数 - 多框架

javascript - jQuery - 链接多个 .next() 方法的替代方法

python - 具有嵌套函数范围的 UnboundLocalError

java - python tarfile.py "file could not be opened successfully"

python - 初始化类定义的可选变量,其默认值与实例变量相同

python - 如何在Python类中使用列表创建字典?

python - python 编译文件(pyc)是否需要系统上导入的库,即使它被编译为字节码?