我最近发现自己使用了以下模式:
x = 3
if this:
this.process()
if this.something:
x = this.a_value
我不想这样做:
if this and (this.process() or True) and this.someting:
x = this.a_value
else:
x = 3
或者这个:
if this:
this.process()
if this.something:
x = this.a_value
else:
x = 3
else:
x = 3
但我不禁觉得设置值然后更改它有点乱,特别是考虑到在某些用例中很少使用回退值。
有更好/更整洁的方式吗?
答案 0 :(得分:3)
我想到你提出的三个选项,第一个,即你正在使用的选项,是最好的。代码很清楚,每个人都会知道发生了什么。我想不出更整洁/更整洁的方式,这也是我根据“简单比复杂更好”的代码来编写的。原则
重新“我不禁觉得设置值然后更改它有点乱,”如果你想要一个默认值,就没办法设置一个。
它肯定比使用其他两种else
方法更加整洁。可读性很重要。
答案 1 :(得分:1)
从代码维护的角度来看,我会接受第一个或第二个案例,但不会因为重复而接受第三个案例。
PS:在Python中,我通常希望看到self
引用类实例对象,而不是this
。最好不要将this
用于此目的或任何其他目的,以避免混淆。
答案 2 :(得分:1)
不必更改值的最简单方法是:
processed = False
if this:
this.process()
if this.something:
x = this.a_value
processed = True
if not processed:
x = 3
但是你要引入另一个变量。如果您的默认值易于计算,我只需将x
设置为顶部的3
即可。应该理解,这是默认值。如果计算的默认值很耗时,那么我会做另外的布尔选项。
答案 3 :(得分:0)
我会this.proccess()
返回this
并执行
try: x = this.avalue if this.process() and this.something else 3
except AttributeError: x = 3;
即使裸体也不是很棒(取决于过程的复杂性)
[编辑]第二个例子不会工作所以我把它拿出来
答案 4 :(得分:0)
这将避免首先设置默认值,而不重复:
def noncefunc(default):
if this:
this.process()
if this.something: return this.a_value
return default
x = noncefunc(3)
但是,这并不是特别清楚,当然也不是你所拥有的进步。如果你想做这样的事情,你最好使用一种语言,通过设计更自然地支持功能风格。如果python是那种语言会很好,但遗憾的是它不是。
可替换地:
class breakexception(exception):pass
try:
if this:
this.process()
if this.something:
x = this.a_value
raise breakexception()
except breakexception: pass
else: x = 3
同样,如果未首先设置非默认值,则仅设置默认值,但不容易理解。
最后:
if this:
this.process()
if this.something:
x = this.a_value
try: x = x
except UnboundLocalError: x = 3
这可能是您所拥有的替代方案中最清晰的,但它并不能代表您原始形式的进步。
坚持你所拥有的。