你是否可以在不提供默认值的情况下使用关键字参数?

22

我习惯于在Python中定义函数/方法如下:

def my_function(arg1=None , arg2='default'):
    ... do stuff here

如果我不提供arg1(或arg2),则会分配默认值None(或'default')。

我能否像这样指定关键字参数,但不带默认值?如果未提供该参数,我希望它引发一个错误。


你能举个例子吗? - thefourtheye
2
可能相关:https://www.python.org/dev/peps/pep-3102/请返回翻译后的文本。 - jonrsharpe
2
Python的哪个版本? - Burhan Khalid
2个回答

31

在现代的Python(也就是版本3)中,您可以:

>>> def func(*, name1, name2):
...     print(name1, name2)
...     
>>> func()
Traceback (most recent call last):
  File "<ipython-input-5-08a2da4138f6>", line 1, in <module>
    func()
TypeError: func() missing 2 required keyword-only arguments: 'name1' and 'name2'    
>>> func("Fred", "Bob")
Traceback (most recent call last):
  File "<ipython-input-7-14386ea74437>", line 1, in <module>
    func("Fred", "Bob")
TypeError: func() takes 0 positional arguments but 2 were given

>>> func(name1="Fred", name2="Bob")
Fred Bob

1
它并不完全是一个可替换的选项,因为func("fred", "bob")可以使用标准关键字参数。 - tdelaney
我正在使用Python 2.7。 - wobbily_col
1
同样地,如果你想指定位置参数并接受更多的关键字参数,你可以这样写:def func(*args, name1, name2, **kwargs) - HerpDerpington
2
因为tdelaney所说的,我认为Dolda2000提供的解决方案是相关的,即“任何参数都可以像关键字表达式一样给出,无论它是否具有默认值”。 - David

22

可以将任何参数作为关键字表达式传递,无论它是否具有默认值:

def foo(a, b):
    return a - b
foo(2, 1)         # Returns 1
foo(a=2, b=1)     # Returns 1
foo(b=2, a=1)     # Returns -1
foo()             # Raises an error

如果你想强制参数成为仅关键字参数,可以查看DSM的答案,但这似乎不是你真正想问的问题。


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