Заявление о выходе в myhdl
У меня есть следующий код в моей среде myhdl:
def rst(self):
rst.next=rst.active
self.wait_clks(5)
def wait_clks(self, cycles):
for _ in range(cycles):
yield self.clk.posedge
приведенный выше код не работает, но когда я заменяю его следующим, он работает:
def rst(self):
rst.next=rst.active
for _ in range(5):
yield self.clk.posedge
Я запутался по этому поводу, если кто-нибудь может объяснить, почему выход в определении функции не работает?
2 ответа
Когда вы просто позвоните generator function
(тот, у которого есть оператор yield в своем теле), вы получаете объект генератора, он даже не начинает проходить через функцию в этой точке, он только начинает это, когда вы начинаете перебирать возвращенный объект генератора (или вызываете next()
в теме). Пример -
>>> def gen1():
... print("Starting")
... for i in range(10):
... yield i
...
>>> g = gen1()
>>> g
<generator object gen1 at 0x00273E68>
Как вы можете видеть выше, она не начала проходить через функцию, она просто вернула объект генератора. Чтобы пройти через функцию, вам нужно перебрать g
или позвоните по телефону next()
в теме. Пример -
>>> g.next()
Starting
0
>>> for i in g:
... print i
...
1
2
.
.
В вашем первом случае также происходит нечто подобное: вы просто вызываете функцию генератора, которая возвращает объект генератора, а затем отбрасываете результат. Скорее всего, откуда угодно rst()
называется, он ожидает объекта генератора в ответ. В этом случае ваш второй метод является лучшим.
Но если вы действительно хотите сделать это в отдельной функции (и я не вижу необходимости делать это в отдельном методе), вы можете напрямую вернуть результат self.wait_clks(5)
обратно из rst(self)
, Пример -
def rst(self):
rst.next=reset.active
return self.wait_clks(5)
Пример, чтобы показать, что это работает -
>>> def f():
... return gen1()
...
>>> for i in f():
... print(i)
...
Starting
0
1
2
.
.
Как описано Анандом, вы не можете просто вызвать генератор, в этом случае, если вы дадите генератор, вы получите то, что ожидаете "
def rst(self):
rst.next=rst.active
yield self.wait_clks(5)