Можно только гадать почему не использовался такой вариант:
cls.last_label = 0 # reset intenal counter
Может из-за того, что в будущем (для сброса) потребуется больше 1 действия. Ответить сможет только автор кода, если вспомнит.
По поводу printHelloWorld(): вы сами ответили на свой вопрос.
Как минимум снизится шанс опечатки. За счет того, что действия находятся в 1 месте.
Отсюда следует другой плюс: чтобы изменить эти действия придется внести правку в 1 место, а не искать все места с копипастой по всей кодовой базе.
Насчет быстродействия: на абстрактном примере нельзя дать никакой другой рекомендации кроме "код надо писать для человека" (ибо может оказаться что узкое место вообще в другом месте и т.п.).
И самое главное (снова имхо): на подобные вопросы нет однозначного ответа. Все зависит от контекста.
gen_cat(consumers) в примере входит внутрь каждого контекста genfrom_queue
Как он может зайти внутрь каждого контекста, если genfrom_queue() никогда не выйдет из вечного цикла, т.к. StopIteration никогда не появится в очереди (см. блок "т.к." из моего предыдущего сообщения)?
P.S. Попробую с другой стороны:
Если приглядеться, то можно увидеть, что (в данном конкретном примере) consumers содержит результаты 3х вызовов genfrom_queue(in_q).
Чем эти 3 вызова genfrom_queue(in_q) отличаются друг от друга?
Вопрос касательно кода из примера "Маршрутизация данных на генераторах (мультиплексирование, броадкастинг)":
будет ли работать этот код с разными очередями?
Я так понимаю что нет.
для чего нужен gen_cat(consumers) в multiplex()?
Я так понимаю что не нужен, нас интересует только genfrom_queue(in_q).
Т.к. (при текущей реализации) gen_cat() никогда не дойдет до 2+ элемента sources,
т.к. sendto_queue() никогда не дойдет до StopIteration,
т.к. в follow() бесконечный цикл.
# Normal statement-based flow control
if <cond1>:
func1()
elif <cond2>:
func2()
else:
func3()
# Equivalent "short circuit" expression
(<cond1> and func1()) or (<cond2> and func2()) or (func3())
"Equivalent "short circuit" expression" НЕ является эквивалентом "Normal statement-based flow control". Пример:
>>> func1 = lambda: print('func1')
>>> func2 = lambda: print('func2')
>>> func3 = lambda: print('func3')
>>> x = 1
>>> (x == 1 and func1()) or (x == 2 and func2()) or (func3())
func1
func3
>>> if x == 1: func1()
... elif x == 2: func2()
... else: func3()
...
func1
И вот сидишь, как дебил, читаешь это сообщение и думаешь: ну и что же изменилось?
Никто не скажет вам что изменилось. Обратите внимание на то, что было сказано выше:
раньше у нас в аппсторе всегда было написано Bugs and improvement fixes, теперь появился человек, который тестирует различные формулировки в истории и их влияние на основные метрики
Я понимаю это так: "у нас есть метрики, мы будем на них воздействовать посредством changelog". Соответственно, там может вообще не быть ни слова про сделанные изменения, если это не влияет на метрики. Другими словами: содержимое changelog определяют метрики, а не изменения.
P.S. Имхо: подобные приложения стоит расценивать как интерфейсы, у которых есть только одна версия — актуальная.
Вот бы плагин для vscode чтобы редактировать настройки wt как настройки самого vscode…
Или хотя бы файл конфига со всеми доступными настройками как в sublime text 3.
Все никак не могу понять: если сломать ABI, то какой смысл оставаться на С++?
Буквально на днях (в рамках "олимпиады" посвященной переписыванию wc) в очередной раз стало понятно что компиляторы разных языков выдают примерно одинаково работающий бинарь.
P.S. Я не против плюсов и своей профессиональной деятельности использую 2 языка: С++17, Python27.
В хаскеле раздрядность Int тоже 64, так что все честно.
P.S. по крайней мере у меня такая разрядность...
GHCi, version 8.6.5: http://www.haskell.org/ghc/ :? for help
Prelude> maxBound :: Int 9223372036854775807
Prelude> import Data.Bits
Prelude Data.Bits> bitSizeMaybe (0 :: Int)
Just 64
Еще забавный порядок действий:
Сначала выполнили кучу действий и только потом проверили пустая строка или нет.
- Я не ставил под сомнение работоспособность кода. Под сомнением находится только объяснение что делает этот код.
- Хорошо что у меня получилось обратить внимание на непонятный (в данном примере) consumers
- Ваши ответы порождают только больше вопросов:
- т.е. без sleep() ничего работать не будет?
- Почему вы в своей версии multiplex() сделали именно так: а не
Предлагаю остановиться на том, что пример не ваш и был взят из «источника Бизли» (соответственно, мне надо обращаться к автору источника).Можно только гадать почему не использовался такой вариант:
Может из-за того, что в будущем (для сброса) потребуется больше 1 действия. Ответить сможет только автор кода, если вспомнит.
По поводу
printHelloWorld(): вы сами ответили на свой вопрос.Как минимум снизится шанс опечатки. За счет того, что действия находятся в 1 месте.
Отсюда следует другой плюс: чтобы изменить эти действия придется внести правку в 1 место, а не искать все места с копипастой по всей кодовой базе.
Насчет быстродействия: на абстрактном примере нельзя дать никакой другой рекомендации кроме "код надо писать для человека" (ибо может оказаться что узкое место вообще в другом месте и т.п.).
И самое главное (снова имхо): на подобные вопросы нет однозначного ответа. Все зависит от контекста.
cls.last_label = 0?Я — нет, но благодаря этой функции я смогу сбросить label.
Итого:
printHelloWorld()нужна в том случае, если определенный набор действий (print("Hello, world!")) повторяетсябольше 2х размногократно.P.S. Все вышесказанное = имхо.
Как он может зайти внутрь каждого контекста, если
genfrom_queue()никогда не выйдет из вечного цикла, т.к. StopIteration никогда не появится в очереди (см. блок "т.к." из моего предыдущего сообщения)?P.S. Попробую с другой стороны:
Если приглядеться, то можно увидеть, что (в данном конкретном примере) consumers содержит результаты 3х вызовов
genfrom_queue(in_q).Чем эти 3 вызова
genfrom_queue(in_q)отличаются друг от друга?Вопрос касательно кода из примера "Маршрутизация данных на генераторах (мультиплексирование, броадкастинг)":
Я так понимаю что нет.
gen_cat(consumers)вmultiplex()?Я так понимаю что не нужен, нас интересует только
genfrom_queue(in_q).Т.к. (при текущей реализации)
gen_cat()никогда не дойдет до 2+ элементаsources,т.к.
sendto_queue()никогда не дойдет доStopIteration,т.к. в
follow()бесконечный цикл.Какая-то косвенная проверка. Может лучше явно проверять именно то, что было написано? Т.е.:
Именно так.
Я считаю что это ограничение должно быть явно указано в статье.
Собственно, следующий пример имеет аналогичную проблему:
Если запустить, то получим следующий вывод:
FP версия делает 1 лишнее действие (по сравнению с IMP).
"Equivalent "short circuit" expression" НЕ является эквивалентом "Normal statement-based flow control". Пример:
Разница в том, что с if'ом func3 не вызывается.
Никто не скажет вам что изменилось. Обратите внимание на то, что было сказано выше:
Я понимаю это так: "у нас есть метрики, мы будем на них воздействовать посредством changelog". Соответственно, там может вообще не быть ни слова про сделанные изменения, если это не влияет на метрики. Другими словами: содержимое changelog определяют метрики, а не изменения.
P.S. Имхо: подобные приложения стоит расценивать как интерфейсы, у которых есть только одна версия — актуальная.
Это совершенно точно не типичная статья в желтой прессе, ибо ценность информации в типичной статье желтой прессе стремится к 0.
Лично я не знал такие подробности, поэтому данная статья позволит будущему мне сэкономить время (если вдруг придется копать в эту сторону).
Будет проще разобраться если не экономить на переменных и не пихать промежуточные результаты в конечное выражение.
Особенно плохо заходят функции вида:
Вот бы плагин для vscode чтобы редактировать настройки wt как настройки самого vscode…
Или хотя бы файл конфига со всеми доступными настройками как в sublime text 3.
Ради новых концепций, которые в плюсах не заложены (при этом иногда реализованы, но через костыли).
Все никак не могу понять: если сломать ABI, то какой смысл оставаться на С++?
Буквально на днях (в рамках "олимпиады" посвященной переписыванию wc) в очередной раз стало понятно что компиляторы разных языков выдают примерно одинаково работающий бинарь.
P.S. Я не против плюсов и своей профессиональной деятельности использую 2 языка: С++17, Python27.
Не надо стрематься. С нетерпением ждем продолжения %)
Интересно, откуда пошла эта подмена ("экспертиза", а не "компетентность")?.. В последние пару месяцев это встречается очень часто.
В хаскеле раздрядность Int тоже 64, так что все честно.
P.S. по крайней мере у меня такая разрядность...