强制函数调用者决定使用哪个默认值

时间:2016-06-23 09:34:40

标签: python parameter-passing variable-assignment default-value function-call

假设我有以下功能:

def myFun(a=None, b=None):
    print a, b

现在我调用函数:

myFun("hi") # Case 1
>>>hi None

myFun(b="hi") # Case 2
>>>None hi

myFun(a="hi") # Case 3
>>>hi None

如果函数调用者没有决定将值“hi”分配给哪个变量,是否有办法抛出异常?这意味着我希望在第一种情况下有例外,但在第二种情况和第三种情况下没有例外。我使用python 2.7。

3 个答案:

答案 0 :(得分:5)

在Python3中,您可以指定keyword-only arguments

def myFun(*, a=None, b=None):
    print(a, b)

myFun('hi')

加注

TypeError: myFun() takes 0 positional arguments but 1 was given

在Python2中,作为Ricardo Silveira points out,您可以使用**kwargs强制所有参数都是关键字参数。

def myFun(**kwargs):
    a, b = kwargs.get('a'), kwargs.get('b')
    print(a, b)

myFun('hi')
# TypeError: myFun() takes exactly 0 arguments (1 given)

答案 1 :(得分:2)

def my_fun(**kwargs):
    a = kwargs.get("a", None)
    b = kwargs.get("b", None)
    # have your code here...

然后:my_fun("hi")不应该工作......

答案 2 :(得分:1)

您实际上可以允许用户使用** kwargs提供他们想要的任何参数。

def myFun(**kwargs):
    print kwargs[a]
    print kwargs[b]

如果未定义a或b,这将导致错误,但它们不是很有帮助。

您可以通过检查值是否存在来制作自己的错误。例如:

def myFun(**kwargs):
  if not kwargs.get(a):
    raise Exception('a is not here!')
  if not kwargs.get(b):
    raise Exception ('b is not here!')
  print kwargs[a], kwargs[b]
相关问题