@python_beginnersЭта группа больше не существует

Страница 1080 из 1885
b0g3r
07.01.2017
10:31:52
да

я чет уже стал путаться

с инстансами)

Igor
07.01.2017
10:32:01
но я могу хуйню спороть

Google
b0g3r
07.01.2017
10:32:09
да, вполне вариант

Igor
07.01.2017
10:32:13
:DDD

:DDDDDDDDDD отлично исправил

b0g3r
07.01.2017
10:33:50
да, катит, спасиб игарь

twitch.tv/seebotschat

Igor
07.01.2017
11:14:51
telegramplayspokemon было бы круче

Amaro
07.01.2017
11:16:36
b0g3r
07.01.2017
11:17:17
len(list(it)) Не?
хм, ну в принципе подходит

Amaro
07.01.2017
11:17:36
А если он вдруг не итератор, то просто len(it)

Cykooz
07.01.2017
11:24:18
подскажите за абстрактные аттрибуты
Как по мне так это какой те дебильный паттрен с абстрактными классами-методами-свойствами, не имеющий отношения к ООП. Если базовому классу нужны методы/свойства, которые не имеют для него логичной реализации (и их приходится заменять на raise NotImplementedError()), то значит что то не так с объектными абстракциями. Скорее всего в этом случае на самом деле нет ни какого обоснованного наследование, а есть натянутый за уши паттерн.

Это всё равно как птица у которой вместо крыла NotImplementedError

b0g3r
07.01.2017
11:25:11
Хорошо, давайте конкретику

Cykooz
07.01.2017
11:26:33
Для конкретики нужен конкретный кейс - что именно вы хотите реализовать через наследование. Вероятно это можно реализовать через другие паттерны. Например через композицию.

Google
b0g3r
07.01.2017
11:26:51
нет, в смысле конкретику от меня)

ща, секундочку

Есть ORM-модельки (peewee) Создаю BaseModel class BaseModel(Model): verbose_name = '' def __repr__(self): pass # переопределаю репр в удобном мне виде class Meta: database = db # указываю что все модели, наследуемые от BaseModel будут использовать эту базу данных

Cykooz
07.01.2017
11:27:33
Есть ещё "интерфейсы", но в питоне как то они не получили широкого распространения, хотя как раз решают эту проблему - когда есть понимание что у объекта должно быть, но это нельзя реализовать в базовом классе

b0g3r
07.01.2017
11:27:39
и вот это verbose_name - очень бы хотелось не забыть переопределить

Cykooz
07.01.2017
11:31:20
и вот это verbose_name - очень бы хотелось не забыть переопределить
Хм, тут наверное через метаклассы можно выкрутится, если вы хотите что бы ещё на этапе "компиляции" кода вылетала ошибка. Использование же raise NotImplementedError() - это рантайм ошибка, и она ничем сильно не отличается от ошибки AttributeError которая случится, если базовый def __repr__(self): просто не найдёт нужный аттрибут в объекте при его вызове .

Т.е. если вы сделаете вот так class BaseModel(Model): def __repr__(self): foo = self.verbose_name class Meta: database = db # указываю что все модели, То будете в рантайме получать ошибку AttributeError если забудете в дочернем классе определить verbose_name

Я бы наверное сделал так, что бы базовая реализация свойста verbose_name брала имя класса (self.__class__.__name__), делала с ним какие-нибудь манипуляции и выдавала как результат (например разбивала на отдельные слова по заглавным буквам, или выдавала имя класса как есть)

Cykooz
07.01.2017
11:52:03
Не, там все равно в каждом подклассе задавать
Ну так и задавай, а если забудешь, то ничего страшного - выдаст значение verbose_name на основе имени дочернего класса. И не надо будет обрабатывать ошибки.

В этом случае рантайм ошибки бессмыслены и вредны. Вот что будет делать приложение если случится NotImplementedError? Скорее всего приложение (или обработка запроса) упадёт. Или ты готов везде в своём коде предусматривать вероятность этой ошибки и ставить try...except везде?

Вот если это будёт "compile time" ошибка - то ещё есть какой то смысл. В этом случае надо заюзать метакласс, который будет проверять наличие свойства verbose_name в момент создания дочернего класса.

Cykooz
07.01.2017
11:59:06
Пусть падает, мне нужно не забыть просто)
Ну вот с рантайм ошибками такое дело, что они могут и не случится, если ты намеренно не выполнишь с приложением какой то кейс, который гарантировано вызовет __repr__ для нужного тебе класса. Т.е. это не очень надёжно, и можно пропустить багу.

Fumycat
07.01.2017
13:05:13
Всем приветус

Кто-нибудь имел дело с jinja2 ?

ThePanaceya
07.01.2017
13:07:45
+

Google
Fumycat
07.01.2017
13:11:30
Всё, разобрался уже

Rita
07.01.2017
14:03:30
Что такое assert? Что он делает?

Johnnie
07.01.2017
14:03:59
выбрасывает эксепшн, если условие не выполнилось

Amaro
07.01.2017
14:33:38
Иногда кажется, что Рита - бот :)

Denis
07.01.2017
14:36:41
+

Rita
07.01.2017
14:38:48
Что делает альт + ф4?

Denis
07.01.2017
14:39:36
Посылает SIGALTF4

Rita
07.01.2017
14:39:51
Очень понятно

Denis
07.01.2017
14:40:32
Какой вопрос, такой ответ

Скрудж
07.01.2017
14:40:45
а я их в вк покупал :(

Johnnie
07.01.2017
14:41:25
https://devman.org

ребята реально проверяют по всем пунктам и пишут внятные комменты о0

Amaro
07.01.2017
14:49:34
К ребятам реально не попасть, ни ВК, ни мордокниги, нет и не будет.

Johnnie
07.01.2017
14:49:44
ну да

я нашел пыльный акк в фэйсбуке о0

Amaro
07.01.2017
14:50:47
У меня есть, возможно, пустой и пыльный акк, но нет желания его искать ;)

Johnnie
07.01.2017
15:06:58
pprint.pprint делает не то что ты думаешь. почитай документацию

огонь коммент)

Google
Johnnie
07.01.2017
15:50:39
чтоб в питоне делать get и post запросы и обрабатывать результат, что нужно использовать?

requests? urllib?

Denis
07.01.2017
15:50:59
urllib

Johnnie
07.01.2017
15:51:13
ty

ThePanaceya
07.01.2017
15:52:40
Я за requests

Хотя бесит его доставлять

Johnnie
07.01.2017
15:53:36
urllib в стандартном пакете, а requests - стороннее?

Denis
07.01.2017
15:53:46
Да

Johnnie
07.01.2017
15:56:36
result = json.load(urlopen(url)) return result['Version']

есть возможность избавиться от ['Version'] ?

Denis
07.01.2017
15:57:54
Каким образом?

Johnnie
07.01.2017
15:58:25
ну хз

что-то вроде result.version

или только руками перелопачивать?

Denis
07.01.2017
15:58:37
Не, это ж словарь

Fumycat
07.01.2017
15:58:47
result.get('version')

Johnnie
07.01.2017
16:00:06
result.get('version')
это я так понимаю избавляет от keyerror?

Fumycat
07.01.2017
16:00:27
Ну да

Johnnie
07.01.2017
16:00:35
спасибо, возьму его :)

тут все спят походу, но я все же попробую

Google
Johnnie
07.01.2017
19:06:53
'{name}, {address}'.format(name=bar['Cells']['Name'], address=bar['Cells']['Address'])

вот так я написал

'{Cells[Name]}'.format(**bar) вот так мне предложили исправить

чо за магия блят?

Denis
07.01.2017
19:07:50
Мб **bar['Cells'] ?

Johnnie
07.01.2017
19:08:25
Мб **bar['Cells'] ?
мб, но щас оно вроде как работает, выводит название без адреса

просто я не понимаю как

b0g3r
07.01.2017
19:08:37
всё верно

** - распаковывает

Denis
07.01.2017
19:08:41
** знаешь что делает?

Johnnie
07.01.2017
19:08:55
нет походу

типа делает key1=val1,key2=val2

и тд?

b0g3r
07.01.2017
19:09:50
bar = {'Cells': {'Name': '', 'Address':''}}

когда делаешь

func(**bar)

Страница 1080 из 1885

Эта группа больше не существует Эта группа больше не существует