python函数的特别参数(/和*)

2020年5月15日 / 38次阅读 / Last Modified 2020年5月15日
函数参数

从python3.8开始,函数定义中出现了两个可选的特别参数,分别是 / 和 *。这两个特别参数规定了函数参数中,哪些是位置参数(positional-only),哪些是关键词参数(keyword-only),哪些是即可位置也可关键词的参数(positional or keyword),也被成为标准参数(standard)。

如果函数定义中没有出现 / 和 * ,则这个函数的所有参数都属于即可位置也可以关键词的参数,但是同样的,关键词参数后面不允许再出现位置参数

使用 / 和 * 的基本规则是:/ 之前的为positional-only参数, * 之后的为keyword-only参数,两者之间的是positional or keyword参数。/只能出现在*左边。这种设计兼容了之前的函数接口定义,那些函数接口中都没有 / 和 * 符号,因此都属于 positional or keyword参数。

>>> def standard_arg(arg):
...     print(arg)
...
>>> def pos_only_arg(arg, /):
...     print(arg)
...
>>> def kwd_only_arg(*, arg):
...     print(arg)
...
>>> def combined_example(pos_only, /, standard, *, kwd_only):
...     print(pos_only, standard, kwd_only)

各位可以试试这些函数的传参。

python这样的函数接口设计,带来了一个变化,允许同名参数的存在。

>>> def test_arg(abc, **kwa):
...     print(abc)
...     print(kwa)
...
>>> test_arg(1, **{'a':1})
1
{'a': 1}
>>> test_arg(1, **{'abc':1})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: test_arg() got multiple values for argument 'abc'

看后面跑出TypeError的情况,test_argh函数有2个standard参数,第1个名为abc,第2个是一个dict对象的unpacking,不过这个dict对象中,也有一个名为abc的key,这样就冲突了。

但是如果使用本文介绍的特别参数就可以:

>>> def test_args2(abc, /, **kwa):
...     print(abc)
...     print(kwa)
...
>>> test_args2(1, abc=123)
1
{'abc': 123}

python3.8开始支持这种函数接口定义方式!

使用指南:

  • 如果你不希望函数的参数名被用户使用,请使用positional-only参数,一般都是参数名没有具体明确的意义的时候。
  • 如果你希望函数参数在传递的时候,严格保持队形(顺序),请使用positional-only参数。
  • 如果参数名很有意义,并在函数被调用的时候,希望用户能够带上这个名称,请使用keyword-only参数。
  • 如果你希望防止用户依赖参数位置而导致传参错误时,请使用keyword-only参数。
  • 对于API接口而言,positional-only的参数可以带来一个好处,即如果参数名称发生变化,API接口也可以保持不变。

-- EOF --

本文链接:https://www.pynote.net/archives/1930

留言区

《python函数的特别参数(/和*)》有1条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    确切地说,python3.8开始支持 / ,之前就支持了 * . [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top