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