?

Log in

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

[Link]

Previous Entry Share Next Entry
Ненависти (к Петону) псто
Ну вот как так можно написать, а? С той стороны приезжает 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"

Tags: , ,

(23 comments | Leave a comment)

Comments
 
[User Picture]
From:evolver
Date:September 8th, 2014 02:51 am (UTC)
(Link)
Ну, подобные симптомы можно на C++ легко сымитировать, сделав косячный деструктор для change, например.

DISCLAIMER: я с питоном не очень детально знаком
From:ex_juan_gan
Date:September 8th, 2014 02:59 am (UTC)
(Link)
Я как-то не понимаю контекста. Джейсон содержит команды? Что б не пересылать весь джаваскрипт, и исполнять его.
[User Picture]
From:provokatorz
Date:September 8th, 2014 04:54 am (UTC)
(Link)
судя по скриншоту у него съехало форматирование последней строчки и она просто "выпала" :))

я так понимаю, что это пост ненависти к "форматной зависимости"
[User Picture]
From:avnik
Date:September 8th, 2014 05:02 am (UTC)
(Link)
кстати да, отступы косячные.
Но это же постараться надо -- их обычно редактор расставляет, и расставляет правильно.

PS flake8/pep8 вроде умеют показывать на такое пальцем
[User Picture]
From:kika
Date:September 8th, 2014 04:18 pm (UTC)
(Link)
Не, пробелы все на месте, форматирование в порядке. Это видимо конверсия в HTML так сработала.
[User Picture]
From:rblaze
Date:September 8th, 2014 06:33 am (UTC)
(Link)
Твой редактор не умеет заменять tab на пробелы?
[User Picture]
From:_slw
Date:September 8th, 2014 08:54 am (UTC)
(Link)
изменил перловой мудрости предков? теперь страдай. боль и страдания искупляют!
[User Picture]
From:kika
Date:September 8th, 2014 04:21 pm (UTC)
(Link)
Зато теперь я еще лучше понимаю разницу между "скриптовым" языком и языком программирования.
[User Picture]
From:fi_mihej
Date:September 9th, 2014 11:42 am (UTC)
(Link)
Либо ты напортачил с пробелами-табами; либо у тебя установлено какое-то расширение, которое при установке что-то в твоем репозитории поломало (тогда надо обновить расширение); либо у тебя стоит какая-то древняя версия интерпретатора (ну там 10-15-летней свежести например. Кхм...), в которой ты нарвался на глюк (тогда надо обновить интерпретатор). Последнее кстати очень вероятно, учитывая что ты используешь 2-ю версию Пайтона а не 3-ю: ты решил юзать что-то традиционное, забывая что 3-я сейчас - основная. И наверно ж с тем же порывом, продолжаешь использовать какую-нибудь "традиционную" сборку года этак 2005-го.

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

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

Edited at 2014-09-09 11:46 am (UTC)
[User Picture]
From:kika
Date:September 9th, 2014 08:27 pm (UTC)
(Link)
Петон 2.7.5, используется естественно virtualenv, в котором стоит только то что нужно и скачанное буквально два дня назад.

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

[User Picture]
From:fi_mihej
Date:September 9th, 2014 10:45 pm (UTC)
(Link)
>>А в петоне же отладчик не нужен, правда?

Эм. Я использую отладчик. Из каробки - да. Любая нормальная (поумнее Notepad-а) IDE для Пайтона умеет код отлаживать стандартным пайтоновским отладчиком. В чем проблема-то?
[User Picture]
From:fi_mihej
Date:September 9th, 2014 10:58 pm (UTC)
(Link)
И да - из консоли ты тоже можешь отлаживать. Таким же PDB.
Собственно как я и сказал: ты совершенно не знаешь инструмент которым пользуешься, но виноват в этом, по твоему мнению не ты, а инструмент. Документация к инструменту (к Пайтону), кстати, хорошая. На редкость. Так что обвинять документацию не выйдет. :)
[User Picture]
From:fi_mihej
Date:September 9th, 2014 11:00 pm (UTC)
(Link)
PS: Python 2.7.5 -- 2013-05-12
Да - не 5-ти летняя "свежесть". Всеголишь 1,5-годичная "свежесть". :)
[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