python - 如果它们为 None,则调用不带可选参数的函数

标签 python python-3.x

有一个函数接受可选参数。

def alpha(p1="foo", p2="bar"):
     print('{0},{1}'.format(p1, p2))

让我重复一下当我们以不同方式使用该函数时会发生什么:

>>> alpha()
foo,bar
>>> alpha("FOO")
FOO,bar
>>> alpha(p2="BAR")
foo,BAR
>>> alpha(p1="FOO", p2=None)
FOO,None

现在考虑我想像 alpha("FOO", myp2)myp2 这样调用它的情况,它们要么包含要传递的值,要么是 。但即使函数处理 p2=None,我还是希望它使用其默认值 "bar"
也许这措辞令人困惑,所以让我改写一下:

If myp2 is None, call alpha("FOO"). Else, call alpha("FOO", myp2).

区别是相关的,因为 alpha("FOO", None)alpha("FOO") 的结果不同。

我怎样才能简明地(但可读地)做出这种区分?

一种可能性通常是 check for None within alpha ,这是值得鼓励的,因为这会使代码更安全。但是假设 alpha 用于其他地方,它实际上应该像处理 None 一样。

我想在调用方处理这个问题

一种可能性是区分大小写:

if myp2 is None:
    alpha("FOO")
else:
    alpha("FOO", myp2)

但是当有多个这样的参数时,这很快就会变成很多代码。 (指数,2^n)

另一种可能性是简单地执行alpha("FOO", myp2 or "bar"),但是这需要我们知道默认值。通常,我可能会采用这种方法,但我以后可能会更改 alpha 的默认值,然后需要手动更新此调用,以便仍然使用(新)默认值调用它值(value)。

我使用的是 python 3.4,但如果您的答案能够提供适用于任何 python 版本的好方法,那将是最好的。


这个问题在技术上已经结束了,但我再次改写了一些要求,因为第一个答案确实掩盖了这一点:
我希望 alpha 的行为通常保留其默认值 "foo", "bar",因此(可能)不是更改 alpha 的选项 本身。
换句话说,假设 alpha 在其他地方被用作 alpha("FOO", None) 其中输出 FOO,None是预期的行为。

最佳答案

将参数作为字典中的 kwargs 传递,从中过滤出 None 值:

kwargs = dict(p1='FOO', p2=None)

alpha(**{k: v for k, v in kwargs.items() if v is not None})

关于python - 如果它们为 None,则调用不带可选参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52494128/

相关文章:

python - 如何成为一名优秀的 Python 程序员?

python-3.x - 散列与 python 中的期望值不匹配的元组

python - 从 Python 中的相邻文件夹导入模块

html - 如何使用python从html文件中抓取数据

python - 在 Pyomo/AMPL 中定义多个模型

使用 Input() 的 Python 代码在 Sublime REPL 中给出语法错误,但可以与 Python Shell 一起使用

python - 将字符串转换为 float 以求和时忽略所有非浮点值

python - 如何在 Windows cmd 上打印不支持的 unicode 字符,例如 "?"而不是引发异常?

python - Pandas :无法写入 excel 文件

python - 从 odeint scipy python 使用的函数中提取值