我已经看到了这个问题(这不是重复的):Python bare asterisk in function argument
在python-3.x中,您可以向函数参数添加一个裸*
,这意味着(引自docs):
“*”或“* identifier”之后的参数是仅限关键字的参数和 可能只传递使用过的关键字参数。
好的,我已经定义了一个函数:
>>> def f(a, b, *, c=1, d=2, e=3):
... print('Hello, world!')
...
我只能通过指定关键字来传递c
,d
和e
变量值:
>>> 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!
问题是:
一些“真实世界”的例子会有很大帮助。提前谢谢。
答案 0 :(得分:16)
PEP 3102非常清楚地解释了基本原理:重点是允许函数接受各种&#34;选项&#34;这本质上是正交的。在定义和调用方面,在位置上指定这些是尴尬的,因为它们没有任何明显的优先级&#34;这将转化为位置顺序。
在各种库中有很多功能可以从中受益。例如,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的兼容性。我想可能许多库出于同样的原因而没有使用语法。我不知道哪些图书馆(如果有的话)已经开始使用它。
答案 1 :(得分:1)
ruby
python中的表达式
def f(a, b, *, c=1, d=2, e=3):
类似于
def f(a,b, options={})
c = options[:c] || 1
d = options[:d] || 2
e = options[:e] || 3
end
红宝石。
因为,python是explicit is better than implicit langauge,它需要*
(splat)运算符参数。