kika: (Default)
[personal profile] kika
Ну вот как так можно написать, а? С той стороны приезжает JSON, я его парсю, нахожу в нем 'command', который 'exit' и в отладочной печати вижу "Now exiting the hive", но не вижу "Listener exits". И это нынче один из самых модных языков для разработки.

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"

Date: 2014-09-08 02:51 am (UTC)
From: [identity profile] evolver.livejournal.com
Ну, подобные симптомы можно на C++ легко сымитировать, сделав косячный деструктор для change, например.

DISCLAIMER: я с питоном не очень детально знаком

Date: 2014-09-08 02:59 am (UTC)
From: [identity profile] juan-gandhi.livejournal.com
Я как-то не понимаю контекста. Джейсон содержит команды? Что б не пересылать весь джаваскрипт, и исполнять его.

Date: 2014-09-08 04:54 am (UTC)
From: [identity profile] provokatorz.livejournal.com
судя по скриншоту у него съехало форматирование последней строчки и она просто "выпала" :))

я так понимаю, что это пост ненависти к "форматной зависимости"

Date: 2014-09-08 05:02 am (UTC)
From: [identity profile] avnik.livejournal.com
кстати да, отступы косячные.
Но это же постараться надо -- их обычно редактор расставляет, и расставляет правильно.

PS flake8/pep8 вроде умеют показывать на такое пальцем

Date: 2014-09-08 04:18 pm (UTC)
From: [identity profile] kika.livejournal.com
Не, пробелы все на месте, форматирование в порядке. Это видимо конверсия в HTML так сработала.

Date: 2014-09-08 06:33 am (UTC)
From: [identity profile] rblaze.livejournal.com
Твой редактор не умеет заменять tab на пробелы?

Date: 2014-09-08 08:54 am (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
изменил перловой мудрости предков? теперь страдай. боль и страдания искупляют!

Date: 2014-09-08 04:21 pm (UTC)
From: [identity profile] kika.livejournal.com
Зато теперь я еще лучше понимаю разницу между "скриптовым" языком и языком программирования.

Date: 2014-09-09 11:42 am (UTC)
From: [identity profile] fi_mihej.livejournal.com
Либо ты напортачил с пробелами-табами; либо у тебя установлено какое-то расширение, которое при установке что-то в твоем репозитории поломало (тогда надо обновить расширение); либо у тебя стоит какая-то древняя версия интерпретатора (ну там 10-15-летней свежести например. Кхм...), в которой ты нарвался на глюк (тогда надо обновить интерпретатор). Последнее кстати очень вероятно, учитывая что ты используешь 2-ю версию Пайтона а не 3-ю: ты решил юзать что-то традиционное, забывая что 3-я сейчас - основная. И наверно ж с тем же порывом, продолжаешь использовать какую-нибудь "традиционную" сборку года этак 2005-го.

С тем же успехом у тебя могло вылезти что-то похожее на C++ (особенно если ты в нем не шаришь и впервый раз что-то написать решил). Уж его-то ты не зовешь "скриптовым" - как ни старайся.

Это я к тому что ты теперь понимаешь не "разницу между "скриптовым" языком и языком программирования", а разницу между инструментом, которым владеешь, и тем, которым не умеешь пользоваться. В любом случае не стоит уподобляться и гнать на язык.
Edited Date: 2014-09-09 11:46 am (UTC)

Date: 2014-09-09 08:27 pm (UTC)
From: [identity profile] kika.livejournal.com
Петон 2.7.5, используется естественно virtualenv, в котором стоит только то что нужно и скачанное буквально два дня назад.

В С++, очевидно, могло вылезти не только что-то подобное, но много хуже (и вылезало тыщи раз). И если бы у меня так странно вела себя отладочная печать, то я бы взял в руки gdb и решил бы вопрос за время, необходимое для написания псто в ЖЖ. А в петоне же отладчик не нужен, правда? Работает искаропки.
Вот о чем и речь - какая коропка, так и работает.

Date: 2014-09-09 10:45 pm (UTC)
From: [identity profile] fi_mihej.livejournal.com
>>А в петоне же отладчик не нужен, правда?

Эм. Я использую отладчик. Из каробки - да. Любая нормальная (поумнее Notepad-а) IDE для Пайтона умеет код отлаживать стандартным пайтоновским отладчиком. В чем проблема-то?

Date: 2014-09-09 10:58 pm (UTC)
From: [identity profile] fi_mihej.livejournal.com
И да - из консоли ты тоже можешь отлаживать. Таким же PDB.
Собственно как я и сказал: ты совершенно не знаешь инструмент которым пользуешься, но виноват в этом, по твоему мнению не ты, а инструмент. Документация к инструменту (к Пайтону), кстати, хорошая. На редкость. Так что обвинять документацию не выйдет. :)

Date: 2014-09-09 10:58 pm (UTC)
From: [identity profile] fi_mihej.livejournal.com
За Пайтоновский PDB можно прочитать тут: https://docs.python.org/2/library/pdb.html

Date: 2014-09-09 11:00 pm (UTC)
From: [identity profile] fi_mihej.livejournal.com
PS: Python 2.7.5 -- 2013-05-12
Да - не 5-ти летняя "свежесть". Всеголишь 1,5-годичная "свежесть". :)

Date: 2014-09-08 10:46 am (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
У меня было две гипотезы - что вместо нормального 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

Date: 2014-09-08 04:20 pm (UTC)
From: [identity profile] kika.livejournal.com
Вообще петон сам неплохо проверяет консистентность отступов, так что дело явно не в этом (да даже если бы и в этом - вызов listen() последний в тестовом скрипте, так что хоть как-то но оно должно было бы вывалиться).

Date: 2014-09-09 08:04 am (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
AFAIK, Питон недостаточно dynamic для того, чтобы поменять смысл for и break. Если break не выходит из цикла - то наверное на самом деле код не доходит до break.

Мне except кажется подозрительным, он поймает все ошибки, включая опечатки в именах переменных.

Date: 2014-09-09 08:29 pm (UTC)
From: [identity profile] kika.livejournal.com
except ничего не печатает и я пробовал его убирать, и пробовал вставлять туда rethrow, то есть raise.

Собственно это и есть зогатко: print перед break работает, а сам break - нет.

Date: 2014-09-08 04:26 pm (UTC)
From: [identity profile] kika.livejournal.com
self.changes - это инстанс ChangesStream из couchdbkit, практически официального клиента для Кауча (ну, его Бенуа пишет). Он открывает лонгполл на каучевский ендпойнт /_changes и висит на нем, выгребая приезжающие кусочки JSON'а в итераторе ( __iter__ )
А вот завершаться он явно не обучен и как его даже не обучить, а хотя бы отладить - совершенно непонятно.

Date: 2014-09-09 04:07 am (UTC)
From: [identity profile] evolver.livejournal.com
Если он не предусматривает force-close, то разнеси выборку и обработку, соединив их очередью, и дай ему закрыться каким-нибудь предусмотренным способом.

Date: 2014-09-09 08:33 pm (UTC)
From: [identity profile] kika.livejournal.com
Я могу его убить, не проблема. Проблема в том что я из цикла читания выйти не могу :-) Мне итератор отдал значение, я его понял как команду на выход, напечатал "выхожу" и не смог выйти :-)

Date: 2014-09-09 11:54 am (UTC)
From: [identity profile] fi_mihej.livejournal.com
Ну вот. Оказывается дело-то не в Пайтоне, а либо в неправильно-написанном ChangesStream, либо в том что ты не прочел его (ChangesStream) документацию, и незнаешь как его правильно завершать.

Date: 2014-09-09 08:32 pm (UTC)
From: [identity profile] kika.livejournal.com
этот ChangesStream - пара десятков строк, там читать-то нечего. Вы чего-то никак не поймете в чем проблема - сделан break из цикла, который идет по итератору, итератор вполне каждый раз отдает yield, все нормально. Но break не срабатывает.

Вот попробуйте так написать итерирумый класс, который честно на каждую итерацию отдает, скажем, строку, но из этого цикла выйти брейком не получается. Я не могу даже придумать как так "неправильно" написать.

Date: 2014-09-09 10:50 pm (UTC)
From: [identity profile] fi_mihej.livejournal.com
Мы - читатели-коментаторы - конечно не можем понять в чем проблема:
1) даже код, который ты выложил - изменен, я б даже сказал исковеркан html-форматированием;
2) про ChangesStream ты написал аж где-то в глубине коментов. И то мельком.

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

Profile

kika: (Default)
kika

January 2017

S M T W T F S
1234567
89 1011121314
151617181920 21
22232425262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 21st, 2017 12:23 pm
Powered by Dreamwidth Studios