Python None的默认值,但不是0

Python None的默认值,但不是0,python,Python,这个的惯用形式是什么: foo = <something complicated> if foo is None : foo = foo_default foo= 如果foo为None:foo=foo\u默认值 我不能使用foo=或foo\u default,因为的0结果被替换为foo\u default您正在查找的。(此处为三元运算符形式) 或者,使用您的数据: >>> foo = <something complicated> >>&

这个的惯用形式是什么:

foo = <something complicated>
if foo is None : foo = foo_default
foo=
如果foo为None:foo=foo\u默认值
我不能使用
foo=或foo\u default
,因为
的0结果被替换为
foo\u default

您正在查找的。(此处为三元运算符形式)

或者,使用您的数据:

>>> foo = <something complicated>
>>> foo = foo_default if foo is None else foo

不过我还是建议,因为在本例中“复杂的东西”似乎意味着一个函数,如果函数返回的是
None

,那么您只需在函数中返回
foo\u default
。(此处为三元运算符形式)

或者,使用您的数据:

>>> foo = <something complicated>
>>> foo = foo_default if foo is None else foo

不过,我建议,因为在本例中“复杂的东西”似乎意味着一个函数,如果函数返回
None
则只需在函数中返回
foo\u default
,使用:

或倒置:

foo = foo_default if foo is None else foo
与或类似,并非所有表达式都被计算;在形式
true\u expr if test\u expr else false\u expr
中,
true\u expr
false\u expr
被完全忽略(不执行),具体取决于
test\u expr
的结果

这允许您在调用不存在的方法之前测试特定的前置条件,例如:

foo = foo(some, argument) if foo is not None else 'default value'
它不允许您在不调用复杂表达式两次的情况下进行测试和赋值,不;您仍然必须使用两个语句,而且没有办法解决这个问题。

使用一个:

或倒置:

foo = foo_default if foo is None else foo
与或类似,并非所有表达式都被计算;在形式
true\u expr if test\u expr else false\u expr
中,
true\u expr
false\u expr
被完全忽略(不执行),具体取决于
test\u expr
的结果

这允许您在调用不存在的方法之前测试特定的前置条件,例如:

foo = foo(some, argument) if foo is not None else 'default value'

它不允许您在不调用复杂表达式两次的情况下进行测试和赋值,不;您仍然必须使用两个语句,并且没有办法解决这个问题。

您当前使用的是惯用语句,没有一个好方法将此逻辑放在一行中

当然,如果您经常使用此模式,可以将其包装到函数中

<强>编辑:< /强>作为其他答案之间的比较,请考虑下面两段代码:

  • OP的当前版本:

    foo = <something complicated>
    if foo is None: foo = foo_default
    
    foo=
    如果foo为None:foo=foo\u默认值
    
  • 建议使用条件表达式的答案:

    foo = <something complicated>
    foo = foo_default if foo is None else foo
    
    foo=
    如果foo不是其他foo,则foo=foo\u默认值
    

对我来说,使用可能计算为
foo=foo
的条件表达式不如使用一行
如果foo为None:foo=foo\u default
,您当前拥有的是惯用的,没有一个好方法将此逻辑放在一行中

当然,如果您经常使用此模式,可以将其包装到函数中

<强>编辑:< /强>作为其他答案之间的比较,请考虑下面两段代码:

  • OP的当前版本:

    foo = <something complicated>
    if foo is None: foo = foo_default
    
    foo=
    如果foo为None:foo=foo\u默认值
    
  • 建议使用条件表达式的答案:

    foo = <something complicated>
    foo = foo_default if foo is None else foo
    
    foo=
    如果foo不是其他foo,则foo=foo\u默认值
    

对我来说,使用可能计算为
foo=foo
的条件表达式比使用一行
更不清晰,如果foo为None:foo=foo\u default
,您也可以始终使用它:

foo = (foo, foo_default)[foo==None]

您也可以随时使用此选项:

foo = (foo, foo_default)[foo==None]

@MartijnPieters OP询问如何组合
foo=
行和
如果foo为None:foo=foo\u default
行。对于条件表达式,您仍然需要设置
foo
的第一行,问题确实可能是,在您可以测试它之前,必须先分配一个复杂的
。@MartijnPieters OP询问如何组合
foo=
行和
如果foo为None:foo=foo\u default
行。对于条件表达式,您仍然需要设置
foo
的第一行,问题可能确实是,在您可以测试它之前,必须先分配一些复杂的
内容。这里的缺点是
foo
foo\u default
都是在检查
foo==None
之前进行评估的。我总是会在代码审查中拒绝包含此习惯用法的建议更改。很难摸索(你必须记住,
bool
int
的一个子类)还有更具可读性的替代方案。这里的缺点是,在检查
foo==None
之前,对
foo
foo\u default
进行评估。我总是会在代码审查中拒绝包含此习惯用法的建议更改。很难去摸索(你必须记住,
bool
int
的一个子类),而且还有更多可读的替代方案。