2020年5月15日 / 211次阅读 / 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开始支持这种函数接口定义方式!
使用指南:
-- EOF --
本文链接:https://www.pynote.net/archives/1930
《python函数的特别参数(/和*)》有1条留言
前一篇:str对象的format函数
后一篇:python的间隔切片技巧
©Copyright 麦新杰 Since 2019 Python笔记
确切地说,python3.8开始支持 / ,之前就支持了 * . [ ]