在Python中安全解除引用

时间:2010-10-31 21:00:35

标签: python groovy null nullpointerexception

Groovy有一个很好的安全解除引用运算符,这有助于避免NullPointerExceptions:

variable?.method()

如果method不是variable,则只会调用null

有没有办法在Python中做同样的事情?或者我必须写if variable: variable.method()

5 个答案:

答案 0 :(得分:9)

  1. 不,没有。

  2. 但要检查None,您不会写if x:,而是编写if x is None:。这是一个重要的区别 - x评估为False的相当多的值是完全有效的(最明显的是0等效数字和空集合),而x is None 如果引用True指向单件对象x,则评估为None

  3. 从个人经验来看,很少需要这样的运营商。是的,None有时用于表示没有价值。但不知怎的 - 也许是因为惯用代码返回null objects合理或抛出异常以表示严重失败 - 我每月只得到AttributeError: 'NoneType' object has no attribute '...'两次。

  4. 我认为这可能是一种错误。 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,因此没有操作员可以处理它。