在Python中安全解除引用

dea*_*mon 13 python null groovy nullpointerexception

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

variable?.method()
Run Code Online (Sandbox Code Playgroud)

method只有在variable没有的情况下才会被调用null.

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

小智 11

  1. 不,没有.

  2. 但要检查None,你不写if x:,你写if x is None:.这是一个重要的区别 - x评估False了很多可以完全有效的值(最值得注意的是0等价数字和空集合),而x is None 评估True参考是否x指向单例对象None.

  3. 从个人经验来看,很少需要这样的操作员.是的,None有时用来表示没有价值.但不知何故 - 也许是因为惯用的代码返回空的对象,在那里明智或抛出异常来指示严重的失败 - 我AttributeError: 'NoneType' object has no attribute '...'每月只得到两次.

  4. 我认为这可能是一种错误.null有两个含义 - "忘记初始化"和"没有数据".第一个是错误,应该抛出异常.第二种情况通常需要比"让我们不要调用此方法"更精细的处理.当我向数据库/ ORM询问a时UserProfile,它不存在而我得到了null......我是否想要默默地跳过方法的其余部分?或者我真的想(当在"库代码"中)抛出一个approriate异常(所以"用户(代码)"知道用户不在那里并且可以做出反应......或者忽略它)或者(当我是编码特定功能)向用户显示一个明智的消息("该用户不存在,您不能将其添加到您的朋友列表中")?

  • 关于#3 - 很多时候你想检查某些内容是否为空。例如,字符串上的任何相等比较最终都会变得更加清晰,编写“my_string?.strip().lower()”并且更容易阅读。 (3认同)

hen*_*ski 6

我已经在 Groovy 中使用过这个功能,所以我不会重复其他海报的 blub 悖论。

在 Groovy 中,像这样的语句

if(possiblyNull?.value){
    ...
Run Code Online (Sandbox Code Playgroud)

在 Python 中执行此操作

try:
    testVar = possiblyNull.value
except:
    testVar = None
if(testVar): 
Run Code Online (Sandbox Code Playgroud)

这绝对是 Groovy 中的一个很酷的特性,并且有助于消除语法噪音。还有一些其他的语法糖,比如 Elvis 运算符或 *,但它们确实牺牲了易读性作为快速修复符号的代价(换句话说,它们不是 Pythonic)。

希望有帮助:-)


nea*_*mcb 6

首先,如果变量不可解引用,您的选择取决于您希望表达式计算的结果。我将假设None是这些示例中的适当结果。

Python 中某些情况的常见习惯用法是使用条件表达式:

variable.method() if variable is not None else None
Run Code Online (Sandbox Code Playgroud)

虽然这种需求可能并不普遍,但在某些情况下它会很有用,尤其是当引用是嵌套的并且您想要这样的东西时,该习语很快就会变得麻烦。

a?.b?.c?.d
Run Code Online (Sandbox Code Playgroud)

请注意,对?.操作符安全延迟的支持是PEP 505的主要主题之一:无感知操作符 \| Python.org。它的当前状态是“延期”。

关于它的一些讨论是在: