Groovy有一个很好的安全解除引用运算符,这有助于避免NullPointerExceptions:
variable?.method()
如果method
不是variable
,则只会调用null
。
有没有办法在Python中做同样的事情?或者我必须写if variable: variable.method()
?
答案 0 :(得分:9)
不,没有。
但要检查None
,您不会写if x:
,而是编写if x is None:
。这是一个重要的区别 - x
评估为False
的相当多的值是完全有效的(最明显的是0等效数字和空集合),而x is None
仅如果引用True
指向单件对象x
,则评估为None
。
从个人经验来看,很少需要这样的运营商。是的,None
有时用于表示没有价值。但不知怎的 - 也许是因为惯用代码返回null objects合理或抛出异常以表示严重失败 - 我每月只得到AttributeError: 'NoneType' object has no attribute '...'
两次。
我认为这可能是一种错误。 null
有两个含义 - “忘记初始化”和“无数据”。第一个是错误,应该抛出异常。第二种情况通常需要比“让我们不要调用此方法”更精细的处理。当我向数据库/ ORM询问UserProfile
时,它不在那里而我得到null
...我是否想要默默地跳过方法的其余部分?或者我真的想(当在“库代码”中)抛出一个approriate异常(所以“用户(代码)”知道用户不在那里并且可以做出反应......或者忽略它)或者(当我是编码一个特定的功能)向用户显示一个明智的消息(“用户不存在,你不能将它添加到你的朋友列表中”)?
答案 1 :(得分:4)
我在Groovy中使用过这个功能,所以我不会重复其他海报的blub悖论。
在Groovy中有这样的声明
if(possiblyNull?.value){
...
这是否在Python中
try:
testVar = possiblyNull.value
except:
testVar = None
if(testVar):
这绝对是Groovy中的一个很酷的功能,有助于消除语法噪音。还有一些其他的语法糖,比如Elvis运算符或*,但它们确实牺牲了易读性作为快速修复符号的费用(换句话说,它们不是Pythonic)。
希望有所帮助: - )
答案 2 :(得分:3)
首先,如果变量不可引用,您的选择取决于表达式要计算的内容。在这些示例中,我假设None
是合适的结果。
Python中某些情况下的常见用法使用条件表达式:
variable.method() if variable is not None else None
虽然这种需求可能并不广泛,但在某些情况下它会很有用,尤其是当引用嵌套时,您会想要这样的东西,这种成语很快变得很麻烦。
a?.b?.c?.d
请注意,支持?.
运算符以进行安全延迟是PEP 505: None-aware operators \| Python.org的主要主题之一。当前状态为“已推迟”。
对此有一些讨论:
答案 3 :(得分:2)
我见过并使用的一个成语是callable(func) and func(a, b, c)
代替普通函数调用(不使用返回值)。但是,如果您尝试使用返回值,如果函数不可调用,则此惯用法将产生False
,这可能不是您想要的。在这种情况下,您可以使用三元运算符来提供默认值。例如,如果函数将返回您将迭代的列表,则可以使用空列表作为func(a, b, c) if callable(func) else []
的默认值。
答案 4 :(得分:1)
Python没有这样的东西。这是因为Python中没有null
指针。嗯,有一个特殊的None
值,它通常用于表示“无价值”的情况。但那只是一个惯例。 None
是一个像所有其他人一样的值/对象。由于没有null
,因此没有操作员可以处理它。