【发布时间】:2015-02-28 18:35:14
【问题描述】:
我正在研究关于惰性评估的想法。这是我遇到问题的 Stream 类:refer to 4.2.6 Stream
class Stream:
"""A lazily computed linked list."""
class Empty:
def __repr__(self):
return 'Stream.empty'
empty = Empty()
def __init__(self, first, compute_rest= lambda: empty):
assert callable(compute_rest), 'compute_rest must be callable.'
self.first = first
self._compute_rest = compute_rest
@property
def rest(self):
"""Return the rest of the stream, computing it if necessary."""
if self._compute_rest is not None:
self._rest = self._compute_rest()
self._compute_rest = None
return self._rest
def __repr__(self):
return 'Stream({0}, <...>)'.format(repr(self.first))
然后我创建一个玩具Stream 进行测试:
s = Stream(1, lambda: Stream(2+3, lambda: Stream(9)))
我想知道当我到达Stream 的末尾时会发生什么,所以我这样做了:
s.rest.rest.rest
我期望屏幕打印出Stream.empty,因为最后一个元素是lambda: empty,但我收到错误回溯消息:
NameError Traceback (most recent call last)
<ipython-input-6-64cf45661094> in <module>()
----> 1 s.rest.rest.rest
<ipython-input-4-7cc49730db55> in rest(self)
16 """Return the rest of the stream, computing it if necessary."""
17 if self._compute_rest is not None:
---> 18 self._rest = self._compute_rest()
19 self._compute_rest = None
20 return self._rest
<ipython-input-4-7cc49730db55> in <lambda>()
7 empty = Empty()
8
----> 9 def __init__(self, first, compute_rest= lambda: empty):
10 assert callable(compute_rest), 'compute_rest must be callable.'
11 self.first = first
NameError: name 'empty' is not defined
所以我的问题是,我确实将我的empty 定义为类变量,但解释器说它没有定义。如果我将 Empty 类定义从嵌套类中取出到全局框架中,则代码可以工作。
我是否了解嵌套类的工作方式错误? 任何人请给我一个提示。感谢您的宝贵时间。
【问题讨论】:
-
“我确实将我的空定义为一个类变量”,但是你试图访问它一个普通变量,使用:
Stream.empty -
@AshwiniChaudhary 谢谢你,直截了当!
标签: python lambda stream nested-class