Что я могу сделать, чтобы получить обычный Python REPL от JetBrains - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь написать программу для упрощения классической пьющей песни, и интерпретатор 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" или, что лучше, параметр, который будет перекомпилирован, если исходный файл новее скомпилированной формы или просто не сохраняет байт-код?

1 Ответ

0 голосов
/ 01 мая 2018

Импортируете ли вы файл, находясь в консоли?

ninetynine.py:

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)

pycharm -> инструменты -> консоль python ...

>>> import ninetynine

>>> ninetynine.sing()

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!

98 bottles of pop on the wall!
98 bottles of pop!
Take one down and pass it around!
97 bottles of pop on the wall!

...

1 bottles of pop on the wall!
1 bottles of pop!
Take one down and pass it around!
0 bottles of pop on the wall!

У меня отлично работает.

...