gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:54:59 26 4
gpt4 key购买 nike

我看过这个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com