如何创建一个只接受位置参数而不接受关键字参数的Python函数?

7
很多Python内置函数不支持关键字参数。例如,chr函数。
>>> help(chr)
Help on built-in function chr in module builtins:

chr(i, /)
    Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.

尝试使用关键字参数将值传递给 chr 是无效的。

>>> chr(i=65)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: chr() takes no keyword arguments

我知道chr函数帮助文本中的/字符表示该函数不接受关键字参数。 如何定义一个不接受关键字参数的函数?当然,我想定义一个接受参数但仅限于位置参数的函数。
这可能会被标记为重复问题,但至少我能得到答案。我在StackOverflow上找不到这个问题的答案。
我还学过另一个类似的特性,即创建一个不接受位置参数的函数。
>>> def f(*, a, b):
...     print(a, b)
...

>>> f(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() takes 0 positional arguments but 2 were given

>>> f(a=1, b=2)
1 2

这个问题与我的类似,但实际上并没有回答我的问题。我仍然不知道如何定义一个不接受关键字参数的函数,就像一些内置函数一样。


2
可能是Python不接受关键字参数的重复问题。 - TrebledJ
这是通过将您的问题标题复制粘贴到Google上找到的。:| 虽然可以承认,它适用于Python 2而不是3。 - TrebledJ
2个回答

3

有一个名为PEP 570的草案,因此无法在纯Python中创建仅限位置参数。但是,可以在用C编写的Python函数中实现。


我猜这个功能将会在Python 3.8中推出。 - Diptangsu Goswami
@DiptangsuGoswami,既然PEP已经被接受,那当然可以! - ForceBru
既然这个功能已经成为Python的一部分,你能否编辑你的答案并添加一个关于这个功能的例子? - Diptangsu Goswami

1

鉴于之前的回答没有更新到3.8版本,这里为未来的读者提供一个简要的回答

函数声明中的/字符将其前面的所有参数标记为仅位置参数。

def func(a, b, /):
    print(a ** b)

func(2, 4) # safe
func(a=2, b=4) # got some positional-only arguments passed as keyword arguments: 'a, b'

在函数声明中,* 字符标记后面的所有参数为仅关键字。
def func(*, a, b):
    print(a ** b)

func(a=2, b=4) # safe
func(2, 4) # takes 0 positional arguments but 2 were given

这些声明可以组合在一起,创建一个带有三个选项的函数 仅限位置参数 - 默认(两者都)- 仅限关键字参数
def func(a, b, /, c, *, d, e):
    pass #too lazy to think of a use case

func(1, 2, 3, d=4, e=5) # safe
func(6, 7, c=8, d=9, e=10) # safe
func(1, b=2, c=3, d=4, e=5) # got some positional-only arguments passed as keyword arguments: 'b'
# etc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接