【问题标题】:Force function caller decide which default value is used强制函数调用者决定使用哪个默认值
【发布时间】:2016-10-25 13:21:28
【问题描述】:

假设我有以下功能:

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。

【问题讨论】:

  • 是的,删除 de 参数并将其用作关键字参数,然后必须按照您的意愿分配变量,第一种情况会引发异常

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


【解决方案1】:

在 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)

【讨论】:

  • 感谢您的帮助!
【解决方案2】:
def my_fun(**kwargs):
    a = kwargs.get("a", None)
    b = kwargs.get("b", None)
    # have your code here...

那么:my_fun("hi") 不应该工作...

【讨论】:

  • 嗯这在第一种情况下不会抛出异常。
  • TypeError: my_fun() 只需要 0 个参数(给定 1 个),这是一个例外,只是不是您准确编写了它,但您可以将其包装在 my_fun 的调用者方法中
  • 抱歉,您的代码没有出现异常,但使用 unutbu 的代码,我明白了。好吧,我认为这取决于我的 python 版本。还是谢谢你。
  • @user2177047:Ricardo Silveira 的回答很有效。但是,请确保调用 my_fun("hi") 而不是 myFun("hi") 来测试它。
  • 该死的你是对的。我没有看到不同的函数名称,尽管我将其注释掉,但它仍然调用了我的函数。它还在记忆中......
【解决方案3】:

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

【讨论】:

  • NameError: global name 'a' is not defined
猜你喜欢
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多