有没有等同于 C# 的 Python?和 ??运营商?

Is there a Python equivalent to the C# ?. and ?? operators?

例如,在 C# 中(从 v6 开始)我可以说:

mass = (vehicle?.Mass / 10) ?? 150;

如果有车辆,则将质量设置为车辆质量的十分之一,但如果车辆为空(或具有空质量,如果质量 属性 为可空类型)则设置为 150。

我可以在我的 C# 应用程序的脚本中使用 Python(特别是 IronPython)中的等效结构吗?

这对于显示可以由其他值修改的值的默认值特别有用 - 例如,我可能在脚本中为我的星际飞船定义了一个装甲组件,它总是消耗 10% space 在安装它的船上可用,它的其他属性也按比例缩放,但我想显示装甲尺寸、生命值、成本等的默认值,以便您可以将它与其他船部件进行比较。否则,我可能不得不编写一个复杂的表达式来执行一两次空值检查,就像我在 v6 之前的 C# 中所做的那样。

不,Python(还)没有 NULL 合并运算符。

有一个提案 (PEP 505 – None-aware operators) 来添加这样的运算符,但是是否应该将这些运算符添加到语言中并没有达成共识,这些将采取什么形式。

来自实施部分:

Given that the need for None -aware operators is questionable and the spelling of said operators is almost incendiary, the implementation details for CPython will be deferred unless and until we have a clearer idea that one (or more) of the proposed operators will be approved.

请注意 Python 实际上 没有 null 的概念。 Python 名称和属性总是 引用某事,它们永远不是null 引用。 None 只是 Python 中的另一个对象,社区不愿意让那个对象如此特殊以至于需要自己的运算符。

直到实现(如果有的话,并且 IronPython 赶上那个 Python 版本),您可以使用 Python 的 conditional expression 来实现相同:

mass = 150 if vehicle is None or vehicle.Mass is None else vehicle.Mass / 10