C#我可以很容易地编写如下:

string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;

是有一个快速的方式做同样的事情在蟒蛇还是我坚持一个"如果"的说法?

有帮助吗?

解决方案

在Python 2.5中,有

A if C else B

表现得很像?:在C中。然而,由于两个原因,它令人不悦:可读性,以及通常有一种更简单的方法来解决问题。例如,在您的情况下:

stringValue = otherString or defaultString

其他提示

@丹

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString
     

这种类型的代码更长,更具表现力,但也更具可读性

是的,它更长。不太确定“更具表现力”和“更具可读性”至少,你的主张是有争议的。我甚至会说这完全错了,原因有两个。

首先,您的代码强调决策(非常极端)。另一方面,条件运算符强调其他东西,即值(分别是所述值的赋值)。这完全这段代码的作者想要的东西。决策实际上是代码的副产品。这里重要的部分是分配操作。你的代码隐藏了很多语法噪音:分支。

你的代码表现力较差,因为它将重点从重要部分转移。

即便如此,您的代码可能会胜过一些模糊的ASCII艺术,如?:。内联 - if 更可取。就个人而言,我不喜欢Python 2.5中引入的变体,因为它是向后的。我希望读取与C三元运算符相同的流(方向),但使用单词而不是ASCII字符:

C = if cond then A else B

这会赢得胜利。

不幸的是,C和C#没有这样的表达声明。但是(这是第二个论点),C语言的三元条件运算符已经建立了很长时间,它已经成为一种习惯用语。三元运算符与“传统” if 语句。因为它是一个成语,任何知道该语言的人都会立即读取这段代码。此外,它是表达这些语义的极短,简洁的方式。事实上,它是最短的可想象的方式。它非常具有表现力,因为它不会因为不必要的噪音而模糊本质。

最后,杰夫阿特伍德已经写出了完美的结论: 最佳代码完全没有代码

编写可读,富有表现力的代码从来都不是坏事。

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

这种类型的代码更长,更具表现力,但也更具可读性,不太可能在路上被绊倒或错误编辑。不要害怕写清楚 - 可读代码应该是目标,而不是副产品。

有一些重复这一问题,例如

在本质上,在一般的设定前的2.5码应该使用这个:

 (condExp and [thenExp] or [elseExp])[0]

(给予condExp,thenExp和elseExp是任意的表情),因为它避免了错误的结果,如果thenExp评估为布尔的假,同时保持简短的路评估。

顺便说一句,j0rd4n,你没有(不要!)在C#中编写这样的代码。除了 IsDefaultOrNull 实际上被称为 IsNullOrEmpty 之外,这是纯粹的代码膨胀。 C#为这些情况提供了合并运算符:

string stringValue = otherString ?? defaultString;

确实,这只有在 otherString null (而不是空)的情况下才有效,但如果事先可以确保(并且经常可以),那么它会使代码更多更具可读性。

我还发现只使用“或”运营商做得很好。例如:

finalString = get_override() or defaultString

如果 get_override()返回“"”或者无,它将始终使用 defaultString

diveintopython.net第4章有答案。它被称为Python中的和 - 或技巧。

您可以利用逻辑表达式返回其值的事实,而不仅仅是true或false状态。例如,您始终可以使用:

result = question and firstanswer or secondanswer

需要注意的是,如果firstanswer为false,它就不像三元运算符那样工作。这是因为首先评估问题,假设它是真的,首先返回firstanswer,除非firstanswer为false,因此这种使用不能像三元运算符那样运行。但是,如果您知道这些值,通常没有问题。一个例子是:

result = choice == 7 and "Seven" or "Another Choice"

如果你使用红宝石,你可以写

stringValue = otherString.blank? ? defaultString : otherString;

内置的 blank?方法意味着null或为空。
来到黑暗的一面......

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top