在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',这实际上并不是一回事。但最初措辞的问题并没有说清楚。答案 0 :(得分:35)
自2.5:
如果您想在无:
上退回a = x if x is not None else y
如果你想回到空字符串,false
,0
等:
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语句,如果这使它更清楚?