Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 23, 2021 18:00:33

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2840
Репутация: +  186  -
Профиль   Отправить e-mail  

__setitem__ и __setattr__ в одном классе

Еленочка Если вы учитесь на курсах, то лучше бегите от туда. Вас там “плохому” учат…



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#2 Дек. 23, 2021 22:30:53

Еленочка
От:
Зарегистрирован: 2008-04-12
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

__setitem__ и __setattr__ в одном классе

Ребят, критиковать всегда легко. Я пришла с Си, даже не пришла, а так шторочку открыла офигела, - “какой умный язык”. Данные курсы оплачены работадателем, который сэкономил (“просили, на те”).
Теория вот такая, к данному заданию - https://github.com/alexopryshko/advancedpython/tree/master/1, https://habr.com/ru/post/122082/ .
Второй месяц решаю “ … ” задания, 16 из них сделала, осталось 4, в которых очень тяжело без базы(спасибо, что предложили такой вариант, учту).
Я прекрасно понимаю, как назвать такие курсы.
Мне сейчас “стремно” отступать, что от меня зависит я хочу сделать, тем более осталось несколько дней.
Есть предложения как решить? Отбор ключей - “топорный”, зато голову даю, что работает:D.
________
И это раздел для новичков, так что сохраняйте уважение, сами тоже когда-то были “зеленые”)))))



Офлайн

#3 Дек. 23, 2021 23:21:34

Еленочка
От:
Зарегистрирован: 2008-04-12
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

__setitem__ и __setattr__ в одном классе

Кстати, __setitem__ и __setattr__ вполне уживаются вместе)

 class B():
    my_list = {}
    def __setitem__(self, key, value):
        self.my_list[key] = value
    def __setattr__(self, key, value):
        self.__setitem__(key.lower(), value)
b = B()
b['a1'] = 25
b.A2 = 30
print(b.my_list)



Офлайн

#4 Дек. 23, 2021 23:43:14

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2840
Репутация: +  186  -
Профиль   Отправить e-mail  

__setitem__ и __setattr__ в одном классе

Посмотри курсы на степики. Я не знаю насколько они качественные, но зато бесплатно.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Дек. 24, 2021 00:27:01

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

__setitem__ и __setattr__ в одном классе

Еленочка
Я пришла с Си
Какие-нибудь программы написала хоть на чём-нибудь?
Еленочка
Данные курсы оплачены работадателем, который сэкономил (“просили, на те”).
Можно было ещё купить акции МММ. И дивиденды потом грести лопатой.
Еленочка
Я прекрасно понимаю, как назвать такие курсы.
Прикрылись именем Бауманки. Продают её имя фактически.

Еленочка
Кстати, __setitem__ и __setattr__ вполне уживаются вместе)
Да много чего можно делать. Только вот надо мышление иметь. И формируется оно через тренировки, которые задаёт теоретическая база, фундаментальная причём, а не высосанная из пальца маленькими мальчиками, прикрывающимися Бауманкой. А если ты пальцем тычешь то туда, то сюда, типа что-нибудь да и выйдет, то это просто метод тыка, который максимум для трактора работает. А программирование гораздо сложнее устроено. Надо иметь мышление, прикреплённое к мышлению, прикреплённому к мышлению, прикреплённому к мышлению. Только тогда будет что-то получаться. А плоскоумное мышление даёт ноль программ в итоге. А без собственных программ ты не программист.



Офлайн

#6 Дек. 24, 2021 01:23:33

Еленочка
От:
Зарегистрирован: 2008-04-12
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

__setitem__ и __setattr__ в одном классе

Py.user.next, про “прикрепленное мышление” - перебор, в остальном здраво (“правда” она колючая). За первый ответ, когда написал “надо так: …. ”, вот за это спасибо отдельное, учла.
Всем спасибо, за отклики и неравнодушие.



Офлайн

#7 Дек. 24, 2021 02:39:18

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

__setitem__ и __setattr__ в одном классе

Еленочка
Py.user.next, про “прикрепленное мышление” - перебор
Если ты пытаешься плыть, загребая только руками, то ты утонешь. Если ты пытаешься плыть, болтая только ногами, то ты утонешь. А вот если ты пытаешься плыть и загребая руками, и болтая ногами, то ты поплывёшь. Но ты далеко не проплывёшь и утонешь. Нужно ещё правильно дышать и следить за сердцем и температурой воды, чтобы не получить переохлаждение и судороги.

Поэтому если ты думаешь, что ты выучишь язык программирования и от этого автоматически станешь программы на нём писать, то ты очень глубоко заблуждаешься. Выученный язык нужен, но это просто загребание руками, не более того. Вот о чём я говорю, когда говорю про “прикреплённое мышление”. У тебя должны быть выработаны несколько разных мышлений и сцеплены друг с другом. Работая совместно, они дают что-то. А по отдельности они не дают ни-че-го. Вот это ничего мы у тебя и наблюдаем в твоём коде. Это поэтому у тебя ничего нет, а не потому, что мы хотим, чтобы у тебя ничего не было.



Отредактировано py.user.next (Дек. 24, 2021 02:44:06)

Офлайн

#8 Дек. 25, 2021 00:57:07

Еленочка
От:
Зарегистрирован: 2008-04-12
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

__setitem__ и __setattr__ в одном классе

py.user.next
У тебя должны быть выработаны несколько разных мышлений и сцеплены друг с другом
Если есть время, напиши что подразумеваешь под фундаментальной базой и как формируется мышление. “На нет и суда нет”)



Офлайн

#9 Дек. 25, 2021 05:31:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

__setitem__ и __setattr__ в одном классе

Еленочка
напиши что подразумеваешь под фундаментальной базой и как формируется мышление
Если я тебя спрошу “сколько будет два умножить на три?”, ты станешь калькулятор искать или в уме это вычислишь? Скорее всего, ты скажешь “шесть”, не задумываясь, а ещё знаешь, что “три умножить на два даст то же самое”, потому что их ещё местами можно менять. Откуда у тебя эта способность быстро перемножать в уме и откуда у тебя это знание вполне конкретного свойства множителей в произведении? Это из тренировок, проведённых до этого, и это из теории, рассказанной до этого.
А теперь вопрос: сможешь ли ты научиться вычислять площадь криволинейной трапеции, не научившись умножать числа от нуля до девяти друг на друга? Скорее всего, нет, так как для вычисления площади нужно будет интегрировать функцию со степенями переменных, а степени - это умножение.
Так вот знание свойств произведения и умение находить произведение являются фундаментальной базой для изучения интегрирования.
То есть они - как части одного дома: что-то является фундаментом; что-то является первым этажом, опирающимся на фундамент; что-то является вторым этажом, опирающимся на первый этаж; что-то является крышей, опирающейся на пятый этаж, опирающийся на четвёртый этаж, опирающийся на третий этаж, опирающийся на второй этаж. Только вместе они образуют дом.
Вот что такое фундаментальная база.

Вот эта удивительная функция, которую ты привела вот здесь
Еленочка
  
    def to_my_list_tuple(self, str_val1, str_val2):
        key_str = None
        key_int = None
        if isinstance(str_val1, int):
            if str_val1 > 0:
                if isinstance(str_val2, str):
                    if len(str_val2) == 1 and str_val2.isalpha():
                        key_str = str_val2.lower()
                        key_int = str_val1
                        return key_str, key_int
                    else:
                        raise ValueError
                        # return key_str, key_int
                else:
                    raise ValueError
                    # return key_str, key_int
            else:
                raise ValueError
                # return key_str, key_int
        elif isinstance(str_val2, int):
            if str_val2 > 0:
                if isinstance(str_val1, str):
                    if len(str_val1) == 1 and str_val1.isalpha():
                        key_str = str_val1.lower()
                        key_int = str_val2
                        return key_str, key_int
                    else:
                        raise ValueError
                        # return key_str, key_int
                else:
                    raise ValueError
                    # return key_str, key_int
            else:
                raise ValueError
                # return key_str, key_int
        elif isinstance(str_val1, str) and isinstance(str_val2, str):
            if ('.' in str_val1) or ('.' in str_val2) or ('-' in str_val1) or ('-' in str_val2):
                raise ValueError
                # return key_str, key_int
            else:
                if (str_val1.isdigit()) and (int(str_val1) > 0):
                    if str_val2.isalpha() and len(str_val2) == 1:
                        key_str = str_val2.lower()
                        key_int = str_val1
                        return key_str, key_int
                    else:
                        raise ValueError
                        # return key_str, key_int
                elif str_val1.isalpha() and len(str_val1) == 1:
                    if (str_val2.isdigit()) and (int(str_val2) > 0):
                        key_str = str_val1.lower()
                        key_int = int(str_val2)
                        return key_str, key_int
                else:
                    raise ValueError
                    # return key_str, key_int
        else:
            raise ValueError
            # return key_str, key_int
Эта функция - просто говнокод какой-то. Именно из-за этого тебе очень скоро понадобится комментировать чуть ли не каждую строчку в нём типа “смотрите! этот else относится к такому-то if'у! смотрите не перепутайте! так как сама я уже запуталась давно в них, но пишу, пишу, как героиня, как Ленин в ссылке - нас бьют, а Ленин всё равно такой молодой и юный Октябрь впереди”. А после того, как ты его откомментируешь до подробностей, в нём надо будет поменять какой-то участок в связи с чем-нибудь и все эти чудесные комментарии тоже надо будет менять следом за этим участком, а то они будут ложь содержать из-за своей устарелости и запутывать читающего этот код с ними ещё больше (он-то не знает, о чём ты там думала, когда делала этот код, какой рой мыслей был у тебя в голове и каким всё умным и понятным казалось). Через полгода ты не сможешь разобрать этот свой же собственный код, а на вопрос “а в нём есть ошибки?” ты будешь честно отвечать “не знаю… я не знаю…” с каким-то ужасом в глазах.
Откуда же взялся этот говнокод? Откуда он берётся? А он берётся из пропущенных занятий, из отсутствующих фундаментальных тренировок и отсутствующих фундаментальных теоретических знаний. Это как спросить тебя “сколько будет два умножить на три?”, а ты, поморгав глазами, ответишь “восемь!” и будешь ждать такая с мыслью “о! а они поверили, что я знаю математику, или нет? ну, ничего, пока прямо не скажут, буду косить до талого типа у меня всё окей с этим”.
Функция не должна быть длиннее 25 строк. Если она длиннее 25 строк, надо провести её декомпозицию.
Функция не должна быть откомментирована. Если она откомментирована, то это значит, что она неясная и запутанная и непонятна сама по себе.
Имя нельзя использовать многократно. Если имя используется многократно, то никогда нельзя точно сказать, что в нём. (имя match_value в to_my_list_str() )
Вложенность блоков не должна быть больше трёх. Если вложенность блоков больше трёх, они полностью занимают место в сознании и не дают думать о чём-то ещё. Например, не дают замечать баги, которые легко заметить.
Если код повторяется-повторяется-повторяется, то надо нарисовать его блок-схему, а потом её перерисовать-перерисовать-перерисовать в компактный вид без запутанностей и по результату написать код.

Вот пример ошибки
Еленочка
  
    def __iter__(self):
        self.froz_set = frozenset(self.my_set_key)
        for key in self.my_list:
            yield key
Что это за множество создаётся? и кому оно нужно?
А… я понял. Это просто голова была забита говнокодом, чтобы ничего не упустить в говнокоде, а то любая мелочь сносит все построения в говнокоде и надо начинать всё заново, и поэтому ресурсов мышления 7+-2 не хватило, чтобы просто понять три строчки этих и заметить в них баг.

Очень скоро таких багов будет появляться всё больше и больше, потому что они любят селиться в говнокоде, где их вообще не заметишь, потому что его очень трудно каждый раз загружать в голову и удерживать в голове, пока с ним работаешь.

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

В данном коде у тебя есть участок, который утверждает, что в ключе только одна буква и только одна цифра. А с чего вдруг там одна буква и одна цифра? Если завтра тебе скажут, что там больше букв и больше цифр, ты этот свой собственный говнокод, сделанный своими же руками, будешь бояться как огня, потому что он такой здоровенный и в нём ничего не разберёшь и не исправишь уже, чтобы ещё больше дров не наломать в нём.

С фундаментальными знаниями ты бы никогда не сказала, что два на три равно восемь, и никогда бы не написала говнометод-небоскрёб с кучей if'ов (с большим цикломатическим числом), который абсолютно не пригоден для каких-то резких изменений, которые ещё там понадобятся 100500 раз. Ты бы сказала “шесть”, а метод этот очень просто бы смотрелся. Он бы выглядел, как __iter__() твой, только без этого странного говномножества, вернее говноfor'а, который должен был бы там быть нормальным и использовать замороженное множество, но не стал таким по несчастливой случайности забитого под завязку говном из говнокода сознания головного мозга.



Отредактировано py.user.next (Дек. 26, 2021 00:14:55)

Офлайн

#10 Дек. 25, 2021 22:53:30

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1393
Репутация: +  124  -
Профиль   Отправить e-mail  

__setitem__ и __setattr__ в одном классе

 class Field:
    def __setitem__(self, key, value):
        setattr(self, self.f(key), value)
    def __getitem__(self, key):
        return getattr(self, self.f(key))
    def f(self, key): # замечательная функция, представленная pu.user.next
        if type(key) is str:
            a, b = key[:len(key) // 2], key[len(key) // 2:]
        elif type(key) is tuple:
            a, b = tuple(map(str, key))
        out = None
        if a[0].isalpha() and b[0].isdigit():
            out = a.lower() + b
        elif a[0].isdigit() and b[0].isalpha():
            out = b.lower() + a
        else:
            raise ValueError
        return out

Rodegast
Если вы учитесь на курсах, то лучше бегите от туда. Вас там “плохому” учат…
этот курс наверное сделан для тех кто программировал на другом языке, чтобы показать какие-то особенности или преимущества языка Python

Отредактировано xam1816 (Дек. 25, 2021 23:00:40)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version