如何使用不带关键字参数的参数创建python函数?

时间:2019-01-18 10:36:41

标签: python python-3.x

许多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字符意味着它不会带有关键字参数。

如何定义不包含关键字参数的函数?当然,我想定义一个仅包含位置参数的函数。

这可能会被标记为重复项,但至少这样我会得到答案。我找不到这个问题的答案。

我了解到的另一个类似功能是创建一个不使用位置参数的函数。

>>> 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问题类似于我的问题,但实际上并未回答我的问题。我仍然不知道如何定义一个不接受关键字参数的函数,例如几个内置函数。

2 个答案:

答案 0 :(得分:2)

PEP 570,它只是草稿,因此无法在纯Python中创建仅位置参数。但是,这可以通过用C为Python编写的函数来完成。

答案 1 :(得分: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