6

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

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

4

2 回答 2

3

PEP 570,这只是一个草稿,所以不能在纯 Python 中创建仅位置参数。然而,这可以在用 C 语言为 Python 编写的函数中完成。

于 2019-01-18T13:34:39.457 回答
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
于 2020-11-11T04:35:19.423 回答