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

Python 强制函数调用者决定使用哪个默认值,python,parameter-passing,variable-assignment,default-value,function-call,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 现在我调用函数: def myFun(a=None, b=None): print a, b myFun("hi") # C

假设我有以下功能:

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
现在我调用函数:

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”分配给哪个变量,是否有方法引发异常?这意味着我希望在第一种情况下有例外,但在第二种和第三种情况下没有例外。我使用Python2.7

def my_fun(**kwargs):
    a = kwargs.get("a", None)
    b = kwargs.get("b", None)
    # have your code here...
然后:
我的乐趣(“嗨”)
不应该起作用


然后:
my\u-fun(“hi”)
不应该工作…

在Python3中,您可以指定:

提高

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

在Python2中,可以使用
**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)

在Python3中,您可以指定:

提高

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

在Python2中,可以使用
**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)

实际上,您可以允许用户通过使用**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]

实际上,您可以允许用户通过使用**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]

是的,删除de参数并将其作为关键字参数使用,然后强制按照您的意愿分配变量,第一种情况将引发异常,删除de参数并将其作为关键字参数使用,然后,必须按照您的意愿分配变量,第一种情况下会引发异常。嗯,这不会在第一种情况下引发异常。TypeError:my_fun()只接受0个参数(给定1个),这是一个异常,只是不是您编写的,但是你可以用my_Fun的caller方法来包装它。对不起,我没有得到你的代码的异常,但是用unutbu的代码我得到了它。我认为这取决于我的python版本。无论如何谢谢。@user2177047:Ricardo Silveira的答案很有效。但是,一定要打
myFun(“hi”)
而不是
myFun(“hi”)
来测试它。该死的,你是对的。我没有看到不同的函数名,尽管我把它注释掉了,它仍然调用了我的函数。它仍然在内存中…嗯,这在第一种情况下不会引发异常。TypeError:my_fun()只接受0个参数(给定1个),这是一个异常,只是它不是你写的,但是你可以用my_fun的调用者方法包装它。对不起,我没有从你的代码中得到异常,但是从unutbu的代码中我得到了异常。我认为这取决于我的python版本。无论如何谢谢。@user2177047:Ricardo Silveira的答案很有效。但是,一定要打
myFun(“hi”)
而不是
myFun(“hi”)
来测试它。该死的,你是对的。我没有看到不同的函数名,尽管我把它注释掉了,它仍然调用了我的函数。它还在记忆中…谢谢你,这很有帮助!谢谢你,这很有帮助<代码>名称错误:未定义全局名称“a”
名称错误:未定义全局名称“a”