如何创建一个只接受位置参数而不接受关键字参数的 python 函数?
How to create a python function which take only positional arguments and no keyword arguments?
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
函数的帮助文本中的 /
字符意味着它不会采用关键字参数。
如何定义一个不接受关键字参数的函数?当然,我想定义一个接受参数但只接受位置参数的函数。
这可能会被标记为重复,但至少这样我会得到答案。我找不到这个问题的 Whosebug 答案。
我学到的另一个类似功能是创建一个不接受位置参数的函数。
>>> 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
This 问题与我的相似,但实际上并没有回答我的问题。我仍然不知道如何定义一个不接受关键字参数的函数,就像几个内置函数一样。
有 PEP 570,这只是一个草稿,因此不能在纯 Python 中创建仅位置参数。但是,这可以在用 C 编写的函数中完成 Python.
鉴于以前的答案从未更新到 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
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
函数的帮助文本中的 /
字符意味着它不会采用关键字参数。
如何定义一个不接受关键字参数的函数?当然,我想定义一个接受参数但只接受位置参数的函数。
这可能会被标记为重复,但至少这样我会得到答案。我找不到这个问题的 Whosebug 答案。
我学到的另一个类似功能是创建一个不接受位置参数的函数。
>>> 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
This 问题与我的相似,但实际上并没有回答我的问题。我仍然不知道如何定义一个不接受关键字参数的函数,就像几个内置函数一样。
有 PEP 570,这只是一个草稿,因此不能在纯 Python 中创建仅位置参数。但是,这可以在用 C 编写的函数中完成 Python.
鉴于以前的答案从未更新到 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