x或y:可接受的习语,还是混淆?

2024-10-01 07:10:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须从一个变量中提取值,这个变量可能是空的,并考虑一些默认值。我第一次写这个代码:

if self.maxTiles is None:
    maxX, maxY = 2, 2
else:
    maxX, maxY = self.maxTiles

然后我意识到我可以把它缩短为:

^{pr2}$

但后来我意识到这可能是最简洁易读的:

maxX, maxY = self.maxTiles or (2, 2)

后者是可以接受的,还是太老套了?在


Tags: or代码selfnoneifiselse意识
3条回答

具体来说

self.maxTiles if self.maxTiles is not None else (2, 2)

我发现一般形式if not A: B else: C(无论是作为语句还是表达式)的“双否定”可能会非常混乱/误导;这不是字面上的if not .. else,但是移动{}并不会使“双否定”消失。在

所以,一般来说,我只是将这些结构重写为if A: C else: B。在这个特殊的例子中,如果我选择了三元运算符形式,我会将它编码为

^{pr2}$

关于更一般的问题:a = b or c是好的当且仅当您真的想将c用于b的任何错误值时,a = b or cNone的具体处理是好的。低,b or c是一种更好的表达方式

b if b else c

但这不是一种表达类似表达式的方法,核心测试是b is None。理论上,如果您“知道”b的唯一可能的假值是None,那么它们在语义上是等价的,但是对于代码的读者/维护者来说,强大的“只有可能的假值”约束是不明显的——如果您必须添加注释来解释这一点,or可能声称的任何简洁的优点都无效。。。如果可行的话,最好是“用代码说出来”,而不是让代码变得晦涩难懂,需要注释来明确它在做什么和什么时候(真正有用的注释应该是那些解释什么的注释,而不是解释什么和什么时候的注释[[代码本身应该显示这一点!-)]],而是在不明显的情况下,为什么这个特定的代码功能为应用程序提供了什么用途)。在

如果您在beginning of a function处执行此操作,我将使用较长的形式,因为它更具惯用性,并且可以立即识别。是的,这是更多的行,但你几乎没有保存任何字符,短行可以容纳79个字符行=好。在

另外,如果你需要调整逻辑或者增加更多的步骤,你很可能会恢复到长格式。在

除了gddc(假设maxTiles是一个元组的问题)的答案之外,我可能会选择第二个选项,但为了清楚起见,请添加括号:

maxX, maxY = (self.maxTiles) if (self.maxTiles is not None) else (2, 2)

相关问题 更多 >