我怎样才能实现紧密:从C ++ / C#在Python?(How can I closely ach

2019-08-03 03:26发布

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

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

是否有这样做在Python同样的事情的一个快速的方法还是我坚持一个“如果”语句?

Answer 1:

在Python 2.5,有

A if C else B

其行为很像:在C然而,它的令人难以接受的原因有二:可读性,这通常有接近问题的一个简单的方法的事实。 例如,你的情况:

stringValue = otherString or defaultString


Answer 2:

@丹

 if otherString: stringValue = otherString else: stringValue = defaultString 

这种类型的代码是更长和更富有表现力,而且更易读

嗯,是的,它是更长的时间。 不太确定“更有表现力”和“更具可读性”。 最起码,你的要求是有争议的。 我甚至会去尽可能说这是完全错误的,原因有两个。

首先,你的代码强调决策(而极)。 Onthe另一方面,条件运算符强调别的东西,即价值(相应地,说值的分配)。 而这正是这段代码的作者希望。 决策实在是相当的代码的一个副产品。 这里最重要的部分是赋值操作。 您的代码隐藏此任务中有很多语法的噪音:分支。

您的代码是少的表现,因为它从转移的重要组成部分的重点。

即使你的代码可能会胜过一些模糊的ASCII艺术一样?: 一个inline- if将是优选的。 就个人而言,我不喜欢使用Python 2.5中引入的变种,因为它是倒退。 我喜欢的东西,它读取相同的流动(方向)的C三元运算符,但使用的话,而不是ASCII字符:

C = if cond then A else B

此胜手了。

C和C#不幸的是没有这样的表现陈述。 但是,(这是第二个参数),C语言的三元条件运算符是如此悠久的,它本身已经成为一个成语。 三元运算符是语言作为重要的一部分作为“常规” if语句。 因为它是一个成语,任何人谁可以立即知道的语言读取该代码的权利。 此外,它的表达这些语义极短,简洁的方式。 事实上,这是最短的想象方式。 因为它不混淆不必要的噪声本质上它是非常传神。

最后,杰夫阿特伍德撰写了完美的结论是: 最好的代码是没有任何代码在所有



Answer 3:

这是从来没有写可读,表现代码是一件坏事。

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

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



Answer 4:

有此问题,例如一些副本

  • Python中是否有一个三元条件运算符?
  • 什么是取代在Python中三元运营商的最佳方式?

从本质上说,在一般设置预2.5代码应该这样写:

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

(给出condExp,thenExp和elseExp是任意表达式),因为它避免了错误的结果,如果thenExp计算结果为布尔值false,同时保持短路评价。



Answer 5:

顺便说一句,j0rd4n,你不这样做( 不要!)用C#这样的代码。 除了事实IsDefaultOrNull实际上是所谓IsNullOrEmpty ,这是纯粹的代码膨胀。 C#提供了这样的情况下,聚结操作:

string stringValue = otherString ?? defaultString;

这是真的,这只是工作,如果otherStringnull (不是空的),但是如果能够事先保证(通常它可以)它使代码更易读。



Answer 6:

我还发现,仅仅使用“或”操作不很好。 例如:

finalString = get_override() or defaultString

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



Answer 7:

diveintopython.net的第4章给出了答案。 这就是所谓的and-or技巧Python编写的。



Answer 8:

您可以利用的事实,逻辑表达式返回自己的价值,而不仅仅是真或假的地位。 例如,你可以随时使用:

result = question and firstanswer or secondanswer

需要提醒的是它并不像三元运算符的工作,如果firstanswer是假的。 这是因为,问题是先进行计算,假设它返回真firstanswer除非firstanswer是假的,所以这种用法不能像三元运算符。 如果你知道这些值,但是,通常没有问题。 一个例子是:

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


Answer 9:

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

stringValue = otherString.blank? ? defaultString : otherString;

内置的blank? 方法是指空。
过来黑暗的一面...



文章来源: How can I closely achieve ?: from C++/C# in Python?