Python中的安全引用

问题描述 投票:15回答:5

Groovy有一个很好的运算符,可以安全地取消引用,这有助于避免NullPointerExceptions:

variable?.method()

仅当method不是variable时,才会调用null

是否有办法在Python中执行相同的操作?还是我必须写if variable: variable.method()

python groovy null nullpointerexception
5个回答
10
投票
  1. 没有,没有。

  2. 但是要检查None,您不写if x:,而是写if x is None:。这是一个重要的区别-对于相当理想的相当多的值,x的取值为False(最值得注意的是0等效数字和空集合),而x is None only的取值为True如果引用x指向单例对象None

  3. 根据个人经验,很少需要这样的操作员。是的,None有时用于表示无值。但是不知何故-也许是因为惯用代码返回了null objects或抛出异常以指示严重故障-我每月只收到两次AttributeError: 'NoneType' object has no attribute '...'

  4. 我会认为这可能是一个错误的功能。 null有两个含义-“忘记初始化”和“没有数据”。第一个是错误,应引发异常。第二种情况通常比“让我们不调用此方法”需要更多的复杂处理。当我向数据库/ ORM请求UserProfile时,它不存在,而是得到了null ...我是否要无声地跳过该方法的其余部分?还是我真的想(当在“库代码”中)抛出适当的异常(因此“用户(代码)”知道用户不在那儿并且可以做出反应...或忽略它)或(当我在对特定功能进行编码)向用户显示一条明智的消息(“该用户不存在,您无法将其添加到您的朋友列表中”)?


4
投票

我已经在Groovy中使用了此功能,因此我不会重复其他海报的blub悖论。

在Groovy中这样的语句

if(possiblyNull?.value){
    ...

在Python中执行此操作

try:
    testVar = possiblyNull.value
except:
    testVar = None
if(testVar): 

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

希望有帮助:-)


2
投票

我已经看到并使用的惯用法是callable(func) and func(a, b, c)代替普通的函数调用(不使用返回值)。但是,如果您尝试使用返回值,则该成语将在函数不可调用的情况下产生False,这可能不是您想要的。在这种情况下,您可以使用三元运算符提供默认值。例如,如果函数将返回要迭代的列表,则可以将空列表用作默认值,并带有func(a, b, c) if callable(func) else []


1
投票

Python没有这样的东西。这是因为Python中没有null指针。好吧,有一个特殊的None值,该值通常在表示“无值”的情况下使用。但这只是一个约定。 None是一个值/对象,与其他所有对象一样。而且由于没有null,所以没有运算符可以处理。


0
投票

首先,如果变量不可引用,您的选择取决于表达式要计算的内容。在这些示例中,我认为None是合适的结果。

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

result = variable.method() if variable is not None else None

尽管这种需求可能并不广泛,但在某些情况下它会很有用,尤其是当引用嵌套时​​,您会想要类似的东西,这种成语很快变得很麻烦。

result = a?.b?.c?.d

请注意,?.运算符对安全延迟的支持是PEP 505: None-aware operators \| Python.org的主要主题之一。当前状态为“已推迟”。

一些讨论在:

© www.soinside.com 2019 - 2024. All rights reserved.