11

在 C# 中,我可以轻松编写以下内容:

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

有没有一种在 Python 中做同样事情的快速方法,或者我是否坚持使用“if”语句?

4

9 回答 9

24

在 Python 2.5 中,有

A if C else B

它的行为很像?例如,在您的情况下:

stringValue = otherString or defaultString
于 2008-09-25T19:08:31.470 回答
5

@担

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语句一样是语言的一部分。因为它是一个成语,任何了解该语言的人都会立即正确地阅读此代码。此外,它是表达这些语义的一种极短、简洁的方式。事实上,这是可以想象到的最短路径。它极具表现力,因为它不会用不必要的噪音掩盖本质。

最后,Jeff Atwood 写了一个完美的结论:最好的代码就是没有代码

于 2008-09-25T19:27:21.020 回答
1

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

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

这种类型的代码更长,更具表现力,但也更易读,并且不太可能在路上被绊倒或错误编辑。不要害怕写得富有表现力——可读的代码应该是一个目标,而不是副产品。

于 2008-09-25T19:11:18.733 回答
1

这个问题有几个重复,例如

本质上,在一般设置中,2.5 之前的代码应该使用这个:

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

(给定 condExp、thenExp 和 elseExp 是任意表达式),因为如果 thenExp 计算结果为布尔值 False,它会避免错误结果,同时保持短路计算。

于 2009-10-21T15:37:05.487 回答
0

顺便说一句,j0rd4n,你不要(不要!)用 C# 编写这样的代码。除了IsDefaultOrNull实际调用的事实之外IsNullOrEmpty,这纯粹是代码膨胀。C# 为以下情况提供了合并运算符:

string stringValue = otherString ?? defaultString;

确实,这仅在otherStringis null(而不是空)时才有效,但如果可以事先确保(并且通常可以),它会使代码更具可读性。

于 2008-09-25T19:32:01.787 回答
0

我还发现仅使用“或”运算符效果很好。例如:

finalString = get_override() or defaultString

如果get_override()返回 "" 或 None,它将始终使用defaultString

于 2008-09-25T20:40:32.357 回答
0

diveintopython.net 的第 4 章给出了答案。这在 Python 中被称为与或技巧。

于 2009-05-01T17:44:59.163 回答
-1

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

result = question and firstanswer or secondanswer

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

result = choice == 7 and "Seven" or "Another Choice"
于 2008-09-25T19:14:05.543 回答
-1

如果你使用 ruby​​,你可以写

stringValue = otherString.blank? ? defaultString : otherString;

内置blank?方法表示 null 或空。
来到黑暗的一面...

于 2008-09-25T20:37:53.003 回答