Python 函数参数中的裸露asterix的用途是什么?
我见过这个问题(这不是重复的): 在python-3.x中,您可以向函数参数添加一个空的Python 函数参数中的裸露asterix的用途是什么?,python,function,python-3.x,arguments,keyword-argument,Python,Function,Python 3.x,Arguments,Keyword Argument,我见过这个问题(这不是重复的): 在python-3.x中,您可以向函数参数添加一个空的*,这意味着(引用自): “*”或“*标识符”后的参数仅为关键字参数和 只能使用关键字参数传递 好的,我定义了一个函数: >>> def f(a, b, *, c=1, d=2, e=3): ... print('Hello, world!') ... 我只能通过指定关键字来传递c、d和e变量值: >>> f(1, 2, 10, 20, 30) Tracebac
*
,这意味着(引用自):
“*”或“*标识符”后的参数仅为关键字参数和
只能使用关键字参数传递
好的,我定义了一个函数:
>>> 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!
>f(1,2,10,20,30)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:f()接受2个位置参数,但给出了5个
>>>f(1,2,c=10,d=20,e=30)
你好,世界!
问题是:
- 这种限制/语法限制的动机是什么李>
- 它涵盖哪些用例
- 它真的在切换到python3的第三方库中使用吗
pandas.read\u 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实际上并没有将它们定义为只包含关键字的参数,大概是为了保持与Python2的兼容性。我可以想象,出于同样的原因,许多库都避免使用语法。我不知道哪些库(如果有的话)已经开始使用它。对于那些来自或/和使用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是langauge,所以在参数中需要运算符
PS:我从未使用过python,如果我弄错了,请纠正我。对于需要命名参数以增强可读性的情况,这是很好的,例如窗口:
window(width=800,height=600,fullscreen=true)
非常清楚地解释了基本原理。@BrenBarn感谢您的链接,这对“动机”部分很有帮助。真实世界的示例和用例将完成本主题。据我所知,在其新任务
功能中使用了此功能。此处发布的回复给出了一个直观的解释:将它们强制为关键字参数的原因是,人们不依赖顺序,因此您可以在将来更改它,或添加新的关键字,(例如:ignore_comments='#'
),从逻辑上讲,它将位于lineterminator
的旁边。哇,该函数使用了太多的参数。显然设计有问题。该函数是一个很好的示例,说明了如何不编写代码。