
Nikolay
10.03.2017
09:42:50
и я могу назвать одну пользу
такой класс не заманкипатчишь снаружи
а хотя тьфу, нет, вру
раз просто объект возвращается - с ним что угодно можно делать

Google

Pavel
10.03.2017
09:43:27
обычный декоратор, что тут такого?

Nikolay
10.03.2017
09:43:38
тогда да, это тупо декоратор

Eldar
10.03.2017
09:44:38

Nikolay
10.03.2017
09:44:51

Ilia
10.03.2017
09:44:56
Это вообще напоминает фабрику классов

Nikolay
10.03.2017
09:44:58
классы можно декорировать

87776
10.03.2017
09:45:37
а в питоне надо шарить в монадах?

YaOurTea
10.03.2017
09:45:45

Ilia
10.03.2017
09:45:52
Почему это декоратор для класса если он не принимает класс а только возвращает?

Nikolay
10.03.2017
09:45:56

87776
10.03.2017
09:46:15

Pavel
10.03.2017
09:46:17
def repeat(count):
class Deco:
def __init__(self, env):
self.count = count
self.env = env
def __call__(self, *a, **kw):
for _ in range(self.count):
self.env()
return Deco
@repeat(5)
def foo():
print('foo')
foo()
на выходе - 5 раз фу

Nikolay
10.03.2017
09:46:32

Google

Nikolay
10.03.2017
09:46:46

Ilia
10.03.2017
09:47:06

Nikolay
10.03.2017
09:47:07
но вообще и классы, и функции - first class citizens
так что код валидный

Pavel
10.03.2017
09:47:22

Eldar
10.03.2017
09:48:08

Pavel
10.03.2017
09:48:10
ну и да, двавайте читать докстринги.
Generic common frame skipping wrapper
Will perform action for `x` additional steps

Eldar
10.03.2017
09:49:04
Что значит фрейм в данном случае?

Ilia
10.03.2017
09:49:54

Pavel
10.03.2017
09:51:24

Nikolay
10.03.2017
09:52:35
там два варианта - либо они очень крутые, либо очень тупые
фрейм тут, как я понимаю - это фрейм на уровне выполнения кода интерпретатором
только что они скипают, засунув один в другой - не очень понятно

Eldar
10.03.2017
09:53:08
Тогда я ваще запутался. Какой общий кейс использования для
class A:
class B:
pass
return B

Pavel
10.03.2017
09:53:24

Nikolay
10.03.2017
09:53:53
хотя такие вещии лучше через метаклассы делать

Eldar
10.03.2017
09:54:36

Pavel
10.03.2017
09:56:01

Google

Houston
10.03.2017
10:37:58

Pavel
10.03.2017
10:38:57
сейчас артём допишет...

Artem
10.03.2017
10:39:52
давай


Houston
10.03.2017
10:40:43
Направление не самое прямолинейное, может и найдется кто. В общем, ваше право
#job #вакансия #vacancy
#tooling #configuration_manager
Вакансия: Configuration Manager / Tooling Engineer
Компания: Align Technology, Inc (Москва)
Тип занятости: полная
Оплата: 100 000 - 130 000 net (на руки)
Задачи: команда занимается внедрением инструментов для разработки ПО: от обеспечения высокодоступного Docker API до построения процесса continuous delivery для приложений IOS&Android. Заниматься нужно текущим стеком систем и соотвествующей инфраструктуры (Git, JIRA, Bamboo, Confluence, Fisheye, HPQC, Sonar, Incredibuild, etc) и разработкой инструментов, фреймворков и решений для развития Continuous Integration, Continuous Delivery и в целом автоматизации SDLC в компании.
Python, Ruby, Bash - основные языки для автоматизации. Windows 40%, Enterprise Linux 60%.
Git — система контроля версий.
Continuous Integration — Bamboo.
Бинарный репозиторий - Artifactory.
Chef используется для деплойментов и управления конфигурациями. Инфраструктура - AWS, VMware, Docker
Требования: 2+ года опыта работы инженером, тестировщиком или администратором систем автоматизации цикла разработки ПО; Более 1 года администрирования системы на базе Linux; Уметь эффективно использовать как минимум один из следующих языков: Ruby, Python, Java, Groovy, Go, Shell Scripting (Powershell, BASH); Уровень английского языка: intermediate.
Условия работы:
Глобальная команда — США и Россия; Годовые бонусы по итогам работы, ДМС и страхование жизни; Бесплатное питание; Английский и испанский в офисе и др.
Контакты для связи:
Внутренний HR — Катерина Кушнарева ( @katerina_kushnareva )
ekushnareva@aligntech.com


Igor
10.03.2017
10:45:44
*упивается чувством гордости за отсутствие необходимости сисадминить винды на целых 40%*

arisu
10.03.2017
10:55:49
мне плевать на всех
возвращаю что хочу

Ruslan
10.03.2017
10:56:49

Archer
10.03.2017
10:57:31

Nikolay
10.03.2017
11:07:44

Igor
10.03.2017
11:08:34
ахахахах

Ruslan
10.03.2017
11:08:51
SkipWrapper

Lulz
10.03.2017
11:19:11
ухахах

Ivan
10.03.2017
11:26:15
Всем привет :)
Видимо, я что-то не понимаю. Вот такой момент: http://pastebin.com/BM5YeReE

arisu
10.03.2017
11:27:00
какой?

Lulz
10.03.2017
11:27:15
все перешли?0)0)

Google

Ivan
10.03.2017
11:28:18
Короч, почему, когда дебажу, у меня в B.get_defaults у супера нет аттрибута такого
как я понял, он должен с учётом cls мне прокси строить, и до А.defaults дать добраться.
или в classmethod super резолвит как-то по-другому? В общем, такие дела :)

Igor
10.03.2017
11:35:04
видимо, super в defaults mixin резолвит относительно defaults mixin
и если хочется получить смерженный дикт в B, то надо super(B, cls) в самом B написать, чтоб до А добраться

arisu
10.03.2017
11:42:28
ну правильно

Admin
ERROR: S client not available

arisu
10.03.2017
11:42:31
в Base его и нету
для такого наследования цепочкой мро будет B, A, DefaultsMixin, Base
для DefaulsMixin супером будет Base
отнаследуйтесь в B от миксина тоже

Ivan
10.03.2017
11:43:50
То есть super(DefaultsMixin, B) отдаст не A, DefaultsMixin, Base?

arisu
10.03.2017
11:43:53
чтобы было B, DefaultsMixin, A, Base

Igor
10.03.2017
11:43:57
не, там Base ни на что не влияет
class Base(object):
pass
class DefaultsMixin(object):
@classmethod
def get_defaults(cls):
sup = super(DefaultsMixin, cls)
print('cls:', cls)
print('sup:', sup)
print('cls.defaults', getattr(cls, 'defaults', None))
print('sup.defaults', getattr(sup, 'defaults', None))
class A(DefaultsMixin, Base):
defaults = (
('a1', 'A'),
('a2', 'AA')
)
class B(A):
defaults = (
('a2', 'BB'),
('b1', 'B')
)
вроде

Ivan
10.03.2017
11:44:02
тогда ругается на MRO

Igor
10.03.2017
11:44:03
In [18]: A.get_defaults()
('cls:', <class '__main__.A'>)
('sup:', <super: <class 'DefaultsMixin'>, <A object>>)
('cls.defaults', (('a1', 'A'), ('a2', 'AA')))
('sup.defaults', None)
In [19]: B.get_defaults()
('cls:', <class '__main__.B'>)
('sup:', <super: <class 'DefaultsMixin'>, <B object>>)
('cls.defaults', (('a2', 'BB'), ('b1', 'B')))
('sup.defaults', None)

arisu
10.03.2017
11:45:09
»> class Base(object): pass
»> class DefaultsMixin(object): pass
»> class A(DefaultsMixin, Base): pass
»> class B(A): pass
»> B.mro()
[<class 'B'>, <class 'A'>, <class 'DefaultsMixin'>, <class 'Base'>, <type 'object'>]
а какая цель то? получить объединение всех defaults?
почему бы просто не написать в каждом классе метод get_defaults

Google

Ivan
10.03.2017
11:47:48
ага, коммент в конце пастбина :)

arisu
10.03.2017
11:47:59
а в подклассах их вызвать по цепочке

Ivan
10.03.2017
11:49:00
Написать в каждом классе - можно, но тогда везде будет реализация во многом дублироваться. объявляем свои, берём копию родительских, апдейтим

Igor
10.03.2017
11:50:47
а извне где-нибудь хранить?
хоть в отдельном модуле
фигню сказал, сорри

Ivan
10.03.2017
11:53:29
да воркэраунд придумать можно, можно объявить функцию merge_defaults(...) и в классах просто в B defaults = merge_defaults(A.get_defaults(), (...свои ..) )
явно
наверное так и сделаю. Просто было интересно. Я всегда думал, что super рассматривает всю цепочку наследования, просто умело понимает, куда уже заходил, а куда ещё нет

arisu
10.03.2017
11:56:59
лолнет
он тупой как пробка

Ivan
10.03.2017
11:57:11
Может я что-то перепутал, когда разбирался с super в Scala, и решил, в python видимо так же. Надо будет попробовать

Alexandr
10.03.2017
11:59:30
Ребят есть у кого времечко свободное? Задачку одну надо на сайте выполнить

Nikolay
10.03.2017
11:59:45
в scala самый мутный после питона момент - это yield
он там какой-то непацанский

Alex
10.03.2017
12:00:04
есть ли смысл использовать scala?

Nikolay
10.03.2017
12:00:23