【问题标题】:Pythonic way to map optional parameters to a compulsory one if None如果没有,则将可选参数映射到强制参数的 Pythonic 方法
【发布时间】:2015-08-02 18:22:54
【问题描述】:

我有这样的功能:

def func(foo, bar, nin=None, nout=None):
    if not nin:
        nin = bar
    if not nout:
        nout = bar
    return foo * nin / nout

它接受两个可选参数,如果它们没有传入,我需要将它们映射到另一个强制参数。但这是pythonic的方式吗?还有其他方法可以获取支票并设置ninnout

【问题讨论】:

  • 是的,这是 Pythonic 的方式,除了你应该检查 if nin is not None: 而不是 if not nin: 以避免错误-y 对象的问题None以外的问题.
  • 看起来不错,虽然我会使用 if nin is None: ... 等。
  • 你也可以使用 **kwargs 和 .get, nin, nout = kwargs.get("nin", bar),kwargs.get("nout", foo)

标签: python function parameters


【解决方案1】:

如果你真的想缩短它,你可以这样做:

nin = bar if nin is None else nin

请注意,这里我通过 identity 测试 None,使用 is,而不是 真实性;否则,如果例如会发生什么nin = 0?这不是 None,但仍会评估 false-y(请参阅 truth value testing),因此 style guide 的建议是:

None 等单例的比较应始终使用isis not ...当你真正的意思是当心if x if x is not None -- 例如当测试一个变量或参数是否 默认为 None 被设置为其他值。另一个值可能 具有在布尔值中可能为假的类型(例如容器) 上下文!

【讨论】:

  • 不同的情况,你也可以在这里用== 进行测试。is 感觉就像这里的方式(并且可能稍微快一点)
  • @lolopop 你可以,但是,风格指南对此很清楚!
【解决方案2】:

我会做以下事情:

def func(foo, bar, nin=None, nout=None):
    nin = bar if nin is None else nin
    nout = bar if nout is None else nout
    return foo * nin / nout

【讨论】:

    【解决方案3】:

    None 是输入的方式,您也接受零等。

    我认为您应该使用nin is None 而不是nin == None,并且许多人会认为nin = bar if nin is None else nin 更符合pythonic,但我个人认为两者都可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 2018-06-13
      • 2013-10-07
      • 2019-04-21
      • 2014-03-12
      • 2013-10-30
      • 2014-04-15
      相关资源
      最近更新 更多