Size: a a a

2020 June 23

AM

Artem Malyshev in rannts
Kirill (Cykooz) Kuzminykh
А конструктор класса сделать единым, самым простым. Функции-конструкторы будут приводить свои параметры к этому простому варианту, который понимает конструктор класса
Убивает полиморфизм в клиентском коде.
источник

AM

Artem Malyshev in rannts
Sergey Z
А что значит, протекает в клиентский код? И как это в принципе предотвращать? В питоне всё в общем-то публичное
Вот код, который вызывает мой класс:

TextStream("content").process()
# vs
TextStream.from_file("t.txt").process()

В какой-то другой части приложения надо накой-то знать что есть метод from_file.

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

Я пришёл к тому что теперь там будет

FileStream("t.txt").process()

Но вызывающему коду всё равно придется знать что есть несколько разных классов на не 1.
источник

SA

Sergey Arkhipov in rannts
Ну то есть ты таким образом просто ифчик спрятал в init, и делаешь вид, что фабрика классов - это и есть сам класс.

Я пытался использовать singledispatch, но он выглядит и работает как-то странно, пользоваться им стремно и неудобно. Вообще, на мой взгляд, если в языке нет паттернматчинга, то лучше не пытаться его такими вот неявностями присобачить
источник

SA

Sergey Arkhipov in rannts
А если паттернматчинг в языке есть, то это не значит, к слову, что им прикольно и удобно пользоваться. Чуть в сторону от примеров из учебника, и получаем ебнутую кашу, определяющую, как правило, стейт-машину. См, например, попытки стримить ответ в эрланге (или вообще с сокетами там работать). Особенно люто получается, если сверху еще навешивается компрессия или что-то типа того. Итак раком стоишь, там тут тебе еще пару блинов на спину кладут, гирю и гантелю, и весело лупят хлыстом, пока ты все это говно отлаживаешь.
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Artem Malyshev
Вот код, который вызывает мой класс:

TextStream("content").process()
# vs
TextStream.from_file("t.txt").process()

В какой-то другой части приложения надо накой-то знать что есть метод from_file.

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

Я пришёл к тому что теперь там будет

FileStream("t.txt").process()

Но вызывающему коду всё равно придется знать что есть несколько разных классов на не 1.
Мысль в сторону...
Оптимальнее было бы принимать не путь к файлу, а file-like объект. Это более композабельно и позволяет использовать не только "файлы" из системной FS.
источник

KK

Kirill (Cykooz) Kuzm... in rannts
А с учётом того что относительно легко любую строку завернуть в StringIO или BytesIO, то можно даже отказаться от варианта, когда данные приходят в виде строки.
источник

AM

Artem Malyshev in rannts
Sergey Arkhipov
Ну то есть ты таким образом просто ифчик спрятал в init, и делаешь вид, что фабрика классов - это и есть сам класс.

Я пытался использовать singledispatch, но он выглядит и работает как-то странно, пользоваться им стремно и неудобно. Вообще, на мой взгляд, если в языке нет паттернматчинга, то лучше не пытаться его такими вот неявностями присобачить
Нет, я сделал вообще без IF. Теперь каждый раз когда используешь в своё коде сам решаешь какой класс для этого взять.
источник

SA

Sergey Arkhipov in rannts
фабрику сделал?
источник

AM

Artem Malyshev in rannts
Kirill (Cykooz) Kuzminykh
Мысль в сторону...
Оптимальнее было бы принимать не путь к файлу, а file-like объект. Это более композабельно и позволяет использовать не только "файлы" из системной FS.
Ну ты же понимаешь что со стримом это был пример просто. Но в целом да.
источник

AM

Artem Malyshev in rannts
Sergey Arkhipov
фабрику сделал?
Нет вообще просто 3 отдельных класса. Какой хочешь тот и бери.
источник

AM

Artem Malyshev in rannts
Сам. Руками.
источник

SA

Sergey Arkhipov in rannts
Понял. Паттерн Мануфактура
источник

ИК

Иван Кривошеев... in rannts
Artem Malyshev
Нет вообще просто 3 отдельных класса. Какой хочешь тот и бери.
А почему не обернуть просто значение в какой-нибудь класс?
источник

AM

Artem Malyshev in rannts
Sergey Arkhipov
Понял. Паттерн Мануфактура
Декоратор который oop.
источник

AM

Artem Malyshev in rannts
Иван Кривошеев
А почему не обернуть просто значение в какой-нибудь класс?
Раздувается вызывающий код. Чтобы не плодить обертки аргументов в нескольких местах.
источник

ИК

Иван Кривошеев... in rannts
Artem Malyshev
Раздувается вызывающий код. Чтобы не плодить обертки аргументов в нескольких местах.
Это правда, зато интерфейс удобный)
источник

ИК

Иван Кривошеев... in rannts
Магия, все дела...
источник

SZ

Sergey Z in rannts
тоже мнения прошу, есть у меня импорты циклические снова, и чтоб их разрулить по хорошему, нужно вообще всё расфигачить, но этого не хочется.
насколько хорошо или плохо использовать importlib для их разруливания?
источник

KK

Kirill (Cykooz) Kuzm... in rannts
Sergey Z
тоже мнения прошу, есть у меня импорты циклические снова, и чтоб их разрулить по хорошему, нужно вообще всё расфигачить, но этого не хочется.
насколько хорошо или плохо использовать importlib для их разруливания?
А чем тебе importlib поможет? Хочешь его использовать внутри функций и методов? Так по моему проще вместо него там же использовать обычный import
источник

SZ

Sergey Z in rannts
мне декоратор надо заимпортить :(
источник