@ru_python

Страница 7828 из 9768
Sheridan
22.01.2019
22:15:51
Так то можно переопределить run в bottle, и в mro он не возьмется из первого класса в наследовании, но наверное это говнокод)
а вот кстати хорошо что ты натолкнул меня на мысль - а какая действительно вызовется функция?...

lost
22.01.2019
22:16:02
Ну так это

Почитай про method resolution order

Sheridan
22.01.2019
22:16:46
Почитай про method resolution order
не думаю что питон сильно отличается от других языков. А у всех всегда чтототипа "кто последний тот и папа"

Google
lost
22.01.2019
22:17:07
А вот с змейкой как раз таки наоборот

Если я не ошибаюсь

Alex
22.01.2019
22:18:03
А вот с змейкой как раз таки наоборот
зависит, но в в общем лучае левый предок будет вызван первым.

Sheridan
22.01.2019
22:18:17
спасибо

Alex
22.01.2019
22:20:01
видишь ли тут какая проблема, если у тебя есть общий предок и ты позовешь два конструктора явно, и базовые конструкторы пользуются super, ты потенциально имеешь шанс получить множественный вызов одного из конструкторов базового класса в иерархии.

задача в чем? запустить bottle из другого потока?

Alex
22.01.2019
22:20:57
super() то как раз наиболее правильный способ обращаться к базовым классам

ты нахрена-то влез в класс Bottle, отнаследовался от него, поимел проблем с множественным наследованием на ровном месте…

Terminator
22.01.2019
22:24:39
@lowit_agr будет жить. Поприветствуем!

Sheridan
22.01.2019
22:24:40
задача в чем? запустить bottle из другого потока?
смотри... Не просто из другого потока... Ща на пальцах.... Есть два друга - прометей и графана. Оба два умеют дёргать за вебхуки. У меня есть уже проект - обсервер. "плагинная" реализация. Сейчас умеет читать/матчить логи и срать переделлаными по шаблону результатами в телегу Хочу ещо два плагина. Под графану и прометея соответственно боттл при запуске держит поток. Следовательно нужно в отдельном потоке. threadhelper у меня уже есть, нужно только переопределить метод run() так как вебхук штука простая, то можно и это превратить в базовый для двух плагинов класс, переопределяя метод обработки хука. Как то так.

Donaudampf
22.01.2019
22:29:24
видишь ли тут какая проблема, если у тебя есть общий предок и ты позовешь два конструктора явно, и базовые конструкторы пользуются super, ты потенциально имеешь шанс получить множественный вызов одного из конструкторов базового класса в иерархии.
super и mro как раз для того и нужны, чтобы подобного не возникало. super вызывает методы по цепочке mro, которая формируется один раз для класса, из инстанса которого метод был запущен, при этом иерархия уже линеаризована и два раза одно и то же вызвать не получится(если mro в принципе для данной иерархии можно построить)

Google
Alex
22.01.2019
22:33:21
какие проблемы? К чему быть готовым?
простой пример https://pastebin.com/dgpALrkj

Donaudampf
22.01.2019
22:34:02
что именно, вызов сразу инита вебхука? Можно просто поменять местами ИнпутПлагин и Вебхук в наследовании, тогда вызывать через super, либо оставить как есть и тогда с помощью super(InputPlugin, self) проскочить одну ступень в мро. Но вообще вызов двух инитов - это какая-то херня, зачем это? Нужно просто вызвать super().__init__(...), тот вызовет инит плагина, который в свою очередь - инит вебхука

Donaudampf
22.01.2019
22:35:31
в общем случае инит класса должен получать набор аргументов и вызывать инит предка, передавая ему его аргументы, затем делат ьсвою работу со своими аргументами

Sheridan
22.01.2019
22:36:43
ну по идее да, похоже будет вызывать, и похоже чтобы это исправить надо в кишки глубоко лезть...

Sheridan
22.01.2019
22:39:12
class Derived(Base1, Base2): def __init__(self): super().__init__() print('Derived.__init__')
base1 и base2 у меня ожидают различные параметры в конструктор

похоже придётся в dict всё оборачивать...

и переименовывать метод у threadhelper

или плюнуть да к чертям обратно в плюсы...

Donaudampf
22.01.2019
22:41:54
base1 и base2 у меня ожидают различные параметры в конструктор
какая им разница? Всё, с чем нужно что-то сделать выше по иерархии - можно кинуть через *args, **kwargs

Alex
22.01.2019
22:42:31
да. Крах одного не должен мешать другому.
странная логика если честно, что мешает обрабатывать исключения per request, более того это уже зашито в веб-фреймворк. максимум что должно упасть - отдельный обработчик запроса.

Sheridan
22.01.2019
22:42:37
какая им разница? Всё, с чем нужно что-то сделать выше по иерархии - можно кинуть через *args, **kwargs
вот это явный костыль, ты уж извини. И я теперь понимаю для чего он, раньше понятия не имел. Но сегодня понял.

Alex
22.01.2019
22:42:51
Google
Donaudampf
22.01.2019
22:43:27
вот это явный костыль, ты уж извини. И я теперь понимаю для чего он, раньше понятия не имел. Но сегодня понял.
это не костыль, это нормальная практика передачи неопределённого количества аргументов по цепочке вызовов

Sheridan
22.01.2019
22:43:55
данные должны быть строго определены и по возможности строго типизированны

Alex
22.01.2019
22:46:28
я бы хотел чтобы свалился поток целиком, освободив память и всё такое прочее.
я очень осторожно поинтересуюсь, ты случайно ничего не путаешь

Sheridan
22.01.2019
22:46:50
каким местом это костыль? Это способ разделения ответственности
я читаю это так: "нам ща надо быстро набросать код, архитектура ненужна, планирование ненужно, что потом из этого получится мы не знаем, но прямо щас оно должно уметь 2+2. Но что потом не знаем, поэтому будем принимать неопределенное количество параметров чтобы потом не пришлось расширяться"

Alex
22.01.2019
22:47:27
мне то до твоего 20 летнего опыта далеко, но завершение потока не освобождает выделенную им память, максимум стек.

более того тебе придется в свой и так полный костылей код навернуть логику мониторинга вывалившихся потоков, что лучше бы отдать на откуп systemd и в случае критичной ошибки вывалить сервис целиком.

Sheridan
22.01.2019
22:48:41
с процессом видимо спутал. Сплю уже почти (

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

с другой стороны - полезный опыт, спасибо

Sheridan
22.01.2019
22:52:59
у тебя уже есть этот дикт, называется **kwargs
предпочитаю явно указывать переменные, без магии



Google
Donaudampf
22.01.2019
22:53:14
хотя бы искуственный пример с аргументами инитов и иерархией

Sheridan
22.01.2019
22:53:23
^

Donaudampf
22.01.2019
22:54:49
предпочитаю явно указывать переменные, без магии
так это херовый дизайн, если метод, который не имеет отношения к этим аргументам, требует их явно

зачем вообще передавать в инит аргументы типа self.whatever, если можно их получить из self уже на месте?

Sheridan
22.01.2019
22:55:26
так это херовый дизайн, если метод, который не имеет отношения к этим аргументам, требует их явно
этого делать бы не пришлось если бы питон нормально умел множественное наследование

Donaudampf
22.01.2019
22:56:16
этого делать бы не пришлось если бы питон нормально умел множественное наследование
питон отлично умеет множественное наследование, в частности не провоцирует на херовый дизайн

Sheridan
22.01.2019
22:56:23
зачем вообще передавать в инит аргументы типа self.whatever, если можно их получить из self уже на месте?
потому что этот класс может унаследоваться другим, у которого нет self_options

Admin
ERROR: S client not available

Sheridan
22.01.2019
22:58:08
питон отлично умеет множественное наследование, в частности не провоцирует на херовый дизайн
Не умеет питон в полной мере множественное наследование. Ибо конструкторы тогда должны быть идентичными. Что, в принципе делает сие наследование часто бесполезным

Artem
22.01.2019
22:59:14
он же троллит ?

Sheridan
22.01.2019
22:59:24
https://youtu.be/R-FfI4i0-uY?t=752
странный чел. Сильно самовлюблен.

lost
22.01.2019
22:59:52
ну такое, смотрю его тупо порофлить, рассказывает интересно

Donaudampf
22.01.2019
22:59:59
потому что этот класс может унаследоваться другим, у которого нет self_options
да блин, ну почитай уже хоть основы по питону, чтобы разговор был хоть немного конструктивен. Когда у тебя класс Derived(Parent), и цепочка вызовов через super, то в Parent будет тот же self, что в Derived

?
22.01.2019
23:00:42
Не могу понять, один и тот же код при работе с selenium.phantomjs... На серваке CENTOS7 сайт ничего не возвращяет, просто None, на Windows 7 всё ок

Sheridan
22.01.2019
23:00:47
WebhookHelper может унаследовать другой объект

Google
Donaudampf
22.01.2019
23:00:48
могу повторить
попробуй, повтори

Sheridan
22.01.2019
23:00:56
у которого нет self._options

?
22.01.2019
23:01:14
https://pastebin.com/VE1SN7Ft

Alex
22.01.2019
23:01:40
могу повторить
и про 20 лет опыта не забудь

Donaudampf
22.01.2019
23:01:55
у которого нет self._options
ты вызываешь super() из объекта, в котором есть self._options, значит этот же self._options будет там, куда тебя отправит super

Sheridan
22.01.2019
23:02:12
еще раз

WebhookHelper может унаследовать другой объект

у которого нет self._options

и у его родителей нет self._options

и у его дочерей нет self._options

пожтому я параметризирую этот объект в его конструкторе

при вызове конструктора

Donaudampf
22.01.2019
23:03:42
так не проще на месте поискать, есть они или нет?

Sheridan
22.01.2019
23:03:47
при создании объекта

потому что сначала искать лдно

потом другое

следом третье

не дофига ли лишних движений вметсо того чтобы передать в конструктор сразу правльное?

Donaudampf
22.01.2019
23:04:47
похоже что там в один класс понапихано куча всего

Страница 7828 из 9768