Is there shorthand for returning a default value if None in Python?
在c中,我可以说x ??"",如果x不为空,则给出x;如果x为空,则给出空字符串。我发现它对于使用数据库很有用。
如果python在变量中找不到任何值,是否有返回默认值的方法?
您可以使用or运算符:
注意,如果x是任何错误的值,它也返回"default",包括空列表、0、空字符串,甚至datetime.time(0)(午夜)。
- 如果x是任何不稳定的值,例如None、[]、""等,则返回"默认",但通常足够好且外观更清晰。
- 我得到了NameError: name 'x' is not defined。
- 如果x为0(零),则返回"默认值"
- 我认为这是一个糟糕的做法-这使用一些转换为"x"的bool,如果找不到这样的转换(例如,pandas数据帧和numpy数组),这将失败。
- x or default是一个反模式!这是很难调试的错误的一个常见来源,因为由于许多微妙的原因,x可能会计算为false,即使它是所需的值。
- 我同意Quantmetropolis和Alleo。非常糟糕的做法。如果需要一个默认值,那么这是因为您知道X可以用一些不规则的值(或类型)来替换。所以您的代码应该检测到特定的情况。这不仅避免了意外的副作用(比如在x的合法值为零时提供默认值),而且还为维护程序员(可能是您以后的自己)记录了您打算在这里发生的事情。
- 警告:反模式:使用return"default" if x is None else x。
- ^我在下面未选择的答案上收到了很多赞成票,所以假设人们发现这种反模式是很困难的。希望上面的评论能引起人们的注意,并减轻一些心痛。
- 由于duck类型化,许多用例实际上需要与任何假y值进行比较;哪些多态函数将其处理/返回为none==null='==0值。不要试图将javascript或.NET原则强推到Python上。取默认值,稍后使用EAFP。
- 所以每天一次。太好了。
- 它是完全有效的,不是反模式。就像其他所有的事情一样,你需要知道它做了什么:它不只是忽略一个值,而是忽略所有"错误"的值,包括0、"[]和(以及一些更特殊的情况,比如覆盖其评估的实例)。如果这是你想要的(在很多情况下是这样),那就太完美了。
- @Hejazzman"这是一个很难调试的常见错误源,因为由于许多微妙的原因,X可以评估为错误,即使它是所需的值。"
1
| return"default" if x is None else x |
试试上面的。
- 仅当X为"无"而不是其他假值时才需要默认值时使用此选项。哪个匹配C X?"默认"
- 否则,只需删除is None,并让x单独评估为布尔值。
- 或者使用@starhusker's x或"default"。我经常使用三元正税b/c i,如果x可能是零,那么x.value应该做什么。所以x.value如果x else为"默认",但这是更可读的getattr(obj,"value","default")。权衡的是,后者并没有被许多自动重构工具捕获。
- 它的pythonic pep20,python的禅宗显式优于隐式。如果需要的话,最好只处理没有案例的情况。
可以使用条件表达式:
1
| x if x is not None else some_value |
例子:
1 2 3 4 5 6 7 8 9
| In [22]: x = None
In [23]: print x if x is not None else"foo"
foo
In [24]: x ="bar"
In [25]: print x if x is not None else"foo"
bar |
最有效-我甚至可以在不执行两次或使用额外变量的情况下直接使用函数调用:
1
| self.lineEdit_path.setText( self.getDir(basepath) or basepath ) |
我在打开qt的dialog.getExistingDirectory()和取消时使用它,它返回空字符串。
- "效果最好"—除非x的值是合法的。然后,这种语法将导致微妙的、难以调试的错误。
- 使用数字时很危险,例如:无或0返回0 0或无返回零
你已经得到了三元语法x if x else ''——这就是你想要的吗?
- 实际上它并不是三元语法(任何接受三个操作数的操作符都可以称为三元操作符,而不仅仅是这个操作符)。它的正确名称是一个条件表达式。
- 如果x==0或任何不稳定值,则不起作用
- @那么你就要根据具体情况制定具体的标准…None或任何其他哨兵值或标准…
- @问题的标准在最初的问题中是明确的;因此,你的解决方案是错误的。