当前位置: 代码迷 >> python >> python:can语句是否在表达式内?
  详细解决方案

python:can语句是否在表达式内?

热度:114   发布时间:2023-06-13 15:06:30.0

我正在尝试实现一个懒惰的属性。 比如说,一个对象是由object._x = None初始化的,然后我想写一些东西

@property
def x(self):
    return self._x or (init_x_value(); x)

这样只有在第一次查找属性时才会调用初始值设定项。

在scala中,表达式可以包含语句。 python中有类似的东西可能。 如果没有,有没有其他方法来实现它,或者我应该坚持使用if-else

如果init_x_value 返回None ,您只需使用:

return self._x or init_x_value() or self._x

但请注意,就像在评论中所说的那样,如果self._x假的,比如None[] (空列表), ()一个空元组,或者一个覆盖__bool__方法的类,它将会转到init方法,这可能是计算上昂贵的。

如果init_x_value 返回计算出的x值本身,您甚至可以像下面这样写:

return self._x or init_x_value()

这是因为Python中的or非常特殊: x or y工作原理如下:

if bool(x):
    return x
else:
    return y

并且懒惰地生成xy 由于bool(None)在第一种情况下为False ,因此它将检查self._x 如果self._xNone ,它会通过调用进行init_x_value()因为该方法不返回任何它隐含返回None其不被接受or α链要么,所以它终于解决了最后self._x这就是现在组。

要回答标题问题本身:不,在Python中,表达式不能包含语句。 期。

编写getter的正确pythonic方法是:

@property
def x(self):
    # assume _x defaults to None 
    if self._x is None:
        # here you can have has many statements as 
        # you like ;)
        self._x = init_x_value()
    return self._x

可能看起来不像三重'或'或内联语句那样聪明,但它尽可能简单,直接,清晰和可读

您可以隐藏函数中的语句:

@property
def x(self):
    def initialize_and_return_x():
        init_x_value()
        return self._x
    return self._x or initialize_and_return_x()