?

Log in

No account? Create an account
Ненависти (к Петону) псто - Cyril Pertsev — LiveJournal
September 7th, 2014
07:20 pm

[Link]

Previous Entry Share Next Entry
Ненависти (к Петону) псто

(23 comments | Leave a comment)

Comments
 
[User Picture]
From:_winnie
Date:September 8th, 2014 10:46 am (UTC)
(Link)
У меня было две гипотезы - что вместо нормального break было пойманое исключение StopIteration, или что табы/пробелы перепутали.

Проверил, два предположения не подвердились (до моего браузера доехали только пробелы). В чем же было дело?

Я проверил на таком коде (снипет в посте сам по себе не запускается):

import simplejson

class X:
    def __init__(self):

        self.changes = simplejson.loads(
            '[{ "doc" : { "command" : "exit" }}]  '
        )

    def listen(self):
        print "Listening"
        for change in self.changes:
            try:
                if not change.get(u'deleted'):
                    doc = change.get(u'doc')
                    if doc:
                        print doc
                        if doc.get(u'command') == u'exit':
                            print "Now exiting the hive"
                            break
            except:
                print "Exception in changes reader!"
        print "Listener exits"

X().listen()


После запуска выводится:

Listening
{'command': 'exit'}
Now exiting the hive
Listener exits
[User Picture]
From:kika
Date:September 8th, 2014 04:20 pm (UTC)
(Link)
Вообще петон сам неплохо проверяет консистентность отступов, так что дело явно не в этом (да даже если бы и в этом - вызов listen() последний в тестовом скрипте, так что хоть как-то но оно должно было бы вывалиться).
[User Picture]
From:_winnie
Date:September 9th, 2014 08:04 am (UTC)
(Link)
AFAIK, Питон недостаточно dynamic для того, чтобы поменять смысл for и break. Если break не выходит из цикла - то наверное на самом деле код не доходит до break.

Мне except кажется подозрительным, он поймает все ошибки, включая опечатки в именах переменных.
[User Picture]
From:kika
Date:September 9th, 2014 08:29 pm (UTC)
(Link)
except ничего не печатает и я пробовал его убирать, и пробовал вставлять туда rethrow, то есть raise.

Собственно это и есть зогатко: print перед break работает, а сам break - нет.
[User Picture]
From:kika
Date:September 8th, 2014 04:26 pm (UTC)
(Link)
self.changes - это инстанс ChangesStream из couchdbkit, практически официального клиента для Кауча (ну, его Бенуа пишет). Он открывает лонгполл на каучевский ендпойнт /_changes и висит на нем, выгребая приезжающие кусочки JSON'а в итераторе ( __iter__ )
А вот завершаться он явно не обучен и как его даже не обучить, а хотя бы отладить - совершенно непонятно.
[User Picture]
From:evolver
Date:September 9th, 2014 04:07 am (UTC)
(Link)
Если он не предусматривает force-close, то разнеси выборку и обработку, соединив их очередью, и дай ему закрыться каким-нибудь предусмотренным способом.
[User Picture]
From:kika
Date:September 9th, 2014 08:33 pm (UTC)
(Link)
Я могу его убить, не проблема. Проблема в том что я из цикла читания выйти не могу :-) Мне итератор отдал значение, я его понял как команду на выход, напечатал "выхожу" и не смог выйти :-)
[User Picture]
From:fi_mihej
Date:September 9th, 2014 11:54 am (UTC)
(Link)
Ну вот. Оказывается дело-то не в Пайтоне, а либо в неправильно-написанном ChangesStream, либо в том что ты не прочел его (ChangesStream) документацию, и незнаешь как его правильно завершать.
[User Picture]
From:kika
Date:September 9th, 2014 08:32 pm (UTC)
(Link)
этот ChangesStream - пара десятков строк, там читать-то нечего. Вы чего-то никак не поймете в чем проблема - сделан break из цикла, который идет по итератору, итератор вполне каждый раз отдает yield, все нормально. Но break не срабатывает.

Вот попробуйте так написать итерирумый класс, который честно на каждую итерацию отдает, скажем, строку, но из этого цикла выйти брейком не получается. Я не могу даже придумать как так "неправильно" написать.
[User Picture]
From:fi_mihej
Date:September 9th, 2014 10:50 pm (UTC)
(Link)
Мы - читатели-коментаторы - конечно не можем понять в чем проблема:
1) даже код, который ты выложил - изменен, я б даже сказал исковеркан html-форматированием;
2) про ChangesStream ты написал аж где-то в глубине коментов. И то мельком.

Так что там или таки баг какой-то в сборке пайтона, или ты что-то упустил, и тут нам не прописал. Второе - вероятнее. Чисто статистически.
My Website Powered by LiveJournal.com