在Python中设置回退值的最佳方法是什么?

时间:2012-08-31 03:17:51

标签: python

我最近发现自己使用了以下模式:

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

但我不禁觉得设置值然后更改它有点乱,特别是考虑到在某些用例中很少使用回退值。

有更好/更整洁的方式吗?

5 个答案:

答案 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

这可能是您所拥有的替代方案中最清晰的,但它并不能代表您原始形式的进步。

坚持你所拥有的。