Я пытаюсь написать программу для упрощения классической пьющей песни, и интерпретатор Python ведет себя очень странно.
Мой код читает:
def lines():
bottles = 99
while bottles > 0:
yield str(bottles) + ' bottles of pop on the wall!'
yield str(bottles) + ' bottles of pop!'
yield 'Take one down and pass it around!'
bottles -= 1
yield str(bottles) + ' bottles of pop on the wall!'
yield ''
def sing():
for line in lines():
print(line)
Это работает, как и предполагалось, из командной строки Linux; он может напечатать «1 бутылка поп-музыки», но сейчас делает то, что я хочу.
Тем не менее, из «консоли Python» в JetBrains я получаю под парой перестановок:
>>> ninetynine.sing()
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "C:\Users\chris\PycharmProjects\untitled\ninetynine.py", line 10, in sing
for line in lines():
TypeError: 'function' object is not iterable
Я попытался назвать это немного по-другому, и получил:
>>> for line in ninetynine.lines():
... print(line)
99 bottles of pop on the wall!
99 bottles of pop!
Take one down and pass it around!
98 bottles of pop on the wall!
>>>
Что мне еще не удалось, так это заставить его работать как генератор, работающий по циклу.
Что я могу или должен делать, чтобы получить правильное поведение REPL от PyCharm?
- ОБНОВЛЕНИЕ -
Там происходит какое-то глупое кеширование.
Я повторно ввел в действие файл .py, но ввел последний параметр yield yield как,
yield str(bottles + ' bottles of pop on the wall!')
Это дало очевидную ошибку, поэтому я изменил исходный файл и сохранил:
yield str(bottles) + ' bottles of pop on the wall!
Он сообщил о той же самой ошибке после того, как я повторно импортировал bottles
из REPL, только моя строка бутылок, на которую он указал пальцем, была моей правильной строкой bottle.py, которая теперь правильно помещала )
сразу после bottles
.
Так что происходит какое-то грязное кеширование; Я думаю, что источник не может быть перекомпилирован или что-то в этом роде.
Есть ли опция "make clean" или, что лучше, параметр, который будет перекомпилирован, если исходный файл новее скомпилированной формы или просто не сохраняет байт-код?