在作业中提供回退价值的最Pythonic方法是什么?

时间:2009-04-20 13:10:01

标签: python

在Perl中,能够分配对象通常很好,但如果分配的变量是'undef',则指定一些回退值。例如:

my $x = undef;
my $y = 2;
my $a = $x || $y;

在此之后,

$a == 2

如果值x为None,那么是否有一种简洁的方法可以在Python中实现这一点,或者是一个完整的...

if x is not None
    a = x
else
    a = y

...是实现这一目标的最恐怖的方式吗?

编辑:道歉,正如几位评论者所指出的那样,我并没有真正谈论未定义的价值,而是Perl中的'undef',这实际上并不是一回事。但最初措辞的问题并没有说清楚。

9 个答案:

答案 0 :(得分:35)

自2.5:

如果您想在无:

上退回
a = x if x is not None else y 

如果你想回到空字符串,false0等:

a = x if x else y 

a = x or y 

至于undefined(从未定义,a.k.a。未绑定):

try:
  a = x 
except NameError:
  a = y

或者说更多的是hackish(我不是真的推荐它,但它很简短):

a = vars().get('x',y)

答案 1 :(得分:5)

首先,您可以使用三元组完成全部工作:

a = y if x is None else x

但它无法解决您的问题。您想要做的事情更紧密地实施:

try:
    a = x
except:
    a = y

答案 2 :(得分:4)

只是对你的Perl示例的一些挑剔:

my $x = undef;

这个冗余代码可以缩短为:

my $x;

以下代码没有按照您的说法执行操作:

my $a = $x || $y;

当$ x为 false 时,这实际上会将$ y分配给$ a。假值包括undef,零和空字符串。要仅测试定义,您可以执行以下操作(从Perl 5.10开始):

my $a = $x // $y;

答案 3 :(得分:3)

我确信没有“pythonic”方法可以做到这一点,因为这不是pythonic的模式。控件不应该在优雅的代码中达到未定义的变量引用。有类似的想法是pythonic。最明显的是:

def myRange(start, stop=None):
    start, stop = (0, start) if stop is None else (start, stop)
    ...

重要的是stop是在范围内定义的,但是调用者不必显式传递它,只是它已经采用了它的默认值,改变了参数的语义,这实际上导致了第一个参数是可选的而不是第二个,即使没有这个聪明的技巧,语言也不允许这样做。

话虽如此,这样的事情可能会遵循这个前提而不使用try-catch块。

a = locals().get('x', y)

答案 4 :(得分:1)

有python的三元操作:

a = x if x is not None else y

2.5及以上版本。

答案 5 :(得分:1)

我认为这会有所帮助,因为问题归结为检查变量是否定义:
Easy way to check that variable is defined in python?

答案 6 :(得分:0)

大多数依赖于if语句的解决方案不适用于x为0或负数的情况。

>>> x = 0
>>> y = 2
>>> a = x or y
>>> a
2
>>> 

如果您提前知道变量的名称,可以这样查找:

if 'x' in dir():
    a = x 
except:
     a =y

然而,这个解决方案对我来说似乎有点草率。我认为最好的方法是使用try除了块之外:

try:
    a = x
else:
    a = y

答案 7 :(得分:0)

重写的一种方法......

if x is not None
    a = x
else
    a = y

..是:

x = myfunction()

if x is None:
    x = y

print x

或者,使用异常(可能更多Python'y,取决于代码正在做什么 - 如果它因为出现错误而返回None,则使用异常可能是正确的方法):

try:
    x = myfunction()
except AnException:
    x = "fallback"

print x

所有这一切,原始代码确实没有任何问题:

if x is not None
    a = x
else
    a = y

很长,但我觉得比以下任何一个单行都更容易阅读(和更多Pythonic):

a = x if x is not None else y
a = x or y

答案 8 :(得分:-1)

如果它是函数的参数,你可以这样做:

def MyFunc( a=2 ):
    print "a is %d"%a

>>> MyFunc()
...a is 2
>>> MyFunc(5)
...a is 5

[编辑] 对于downvoters ..解决方案不需要if / else位 - 只需添加以使结果清晰。编辑它以删除if语句,如果这使它更清楚?