加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-16 21:48:27 所属栏目:Python 来源:网络整理
导读:我正在尝试实现一个懒惰的属性.比如说,一个对象是由object._x = None初始化的,然后我想写一些东西 @propertydef x(self): return self._x or (init_x_value(); x) 这样只有在第一次查找属性时才会调用初始值设定项. 在scala中,表达式可以包含语句. python中

我正在尝试实现一个懒惰的属性.比如说,一个对象是由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

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

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

return self._x or init_x_value()

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

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

并且懒惰地生成x和y.由于bool(None)在第一种情况下为False,因此它将检查self._x.如果self._x为None,它将通过调用init_x_value()来继续,因为该方法不返回任何它隐式返回的任何东西,也不被or-chain接受,所以它最终解析为最后一个self._x组.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读