Pull to refresh
22
1
Антон @ammo

Пользователь

Send message

Как говорится, не путайте "отечество" и "ваше превосходительство".
Я вот считаю себя патриотом России, и при этом убежден, что текущая власть и ее курс откровенно вредят России и ее народу. В том числе это касается блокировок в целом и Ютуба в частности. И они весь сами знают, что вредят, потому в отношении того же Ютуба даже признаться не могут, скрывают свое участие.

За последние 24 года люди подустали от новостей об очередных аналоговнетных йотафонах, е-мобилях и прочих роботах федорах. Когда (если) полетит - тогда и будет разговор о гордиться.

Это не дежурный, это директор интернетов целый! Требует, сроки ставит, ух...

А причем здесь правосудие? Задержанием занимается исполнительная власть, а не судебная (да, у "европейских варваров" это разные ветви власти, и из одного кабинета они не управляются)

Область применения достаточно узкая - список словарей. В моей практике гораздо чаще нужно сгруппировать список объектов по одному из полей, т.е. по сути реализовать аналог itertools.groupby, но для НЕ отсортированных данных.

def groupby(iterable, key):
   result = defaultdict(list)
   for obj in iterable:
       result[key(obj)].append(obj)
   return result


groupby(list_of_users, key=lambda user: user.city)

Схема интересная, но как будто бы сущность, вынесенная в название - TACACS - выглядит здесь самой лишней. Можно к бастиону подключаться личной учеткой, а сам бастион будет подключаться к сетевым коробкам одной общей учеткой. Задача ротации пароля этой учетки равна задаче ротации секрета tacacs. Логи команд пишет бастион, поэтому он знает из-под какой реальной учетки какая команда введена.

Милош понимает, что он столкнётся с задачами масштабирования, так что смотрит в сторону библиотеки написанной на Golang

I/O bound задачи

Какая-то очень сомнительная аргументация. Особенно с учетом того, что различных инструментов для автоматизации сети/инфраструктуры на Python написано на порядок больше.
А, хотя это же Яндекс, совсем забыл...

Также, если вы попытаетесь добавить два ключа в словарь с одинаковым хеш-кодом, то второй ключ перезапишет первый:
my_dict = {1: 'one', '1': 'one again'}

{1: 'one again'}

Вранье полнейшее просто от начала и до конца.
Начнем вот с этого:

>>> print({1: 'one', '1': 'one again'})
{1: 'one', '1': 'one again'}

У 1 и '1' просто совсем разный хэш

>>> hash(1)
1
>>> hash('1')
619728117842555882

Но дело совершенно не в этом. Объекты с одинаковым хэшем (дандер __hash__) спокойно могут сосуществовать в рамках одного дикта/сета.
Создадим кастомный класс, у которого всегда будет одинаковое значение хэша (123):

>>> my_int = type('my_int', (int,), {'__hash__': lambda self: 123})
>>> one = my_int(1)
>>> two = my_int(2)
>>> hash(one) == hash(two) == 123
True
>>> one == two
False
>>> {one: 'one', two: 'two'}
{1: 'one', 2: 'two'}

За счет одинакого хэша ключи выше попали в один и тот же бакет в рамках хэшмапа/дикта, но это не мешает им оставаться разными по значению (дандер __eq__) и таким образом храниться вместе в одном словаре.

"Но вернемся к кандидатам. Чаще всего они рассказывают, что SOLID — это акроним, озвучивают все его принципы, но объяснить и привести примеры могут лишь для половины. На остальных либо плавают, либо сливаются."

Я б тоже лучше слился, чем сидеть примеры рожать по 200 строчек, как в статье.

А почему бы человеку, который интернетом не пользуется и в принципе откровенно презирает, не отвалить от этого самого интернета, ну или как минимум не оставить свое "авторитетное" "не читал, но осуждаю" при себе?

  1. Compound statements (multiple statements on the same line) are generally discouraged. В комплекте с код-блоками хабра еще и приходится мотать ваш код влево-вправо, чтобы прочитать.

  2. Don’t compare boolean values to True or False using ==

  3. Не нужно знать предметную область, чтобы штуки типа self.d или self.project.p были чем-то кроме как примерами плохого нейминга.

Ваш код плохо читается не из-за отсутствия enum, а из-за игнорирования pep8 и ужасного нейминга

соглашусь, отличное решение

Если б вы пытались понять так же усердно, как передергиваете мои аргументы, то может и получилось бы

Очевидно же:

  • занимает 3 строчки вместо 1

  • читается дольше чем варианты 1 и 2

А про лучший вариант я уже сказал - он почему-то отсутствует в стандартной библиотеке, хотя по сути очень прост.

def list_iterator(list_, start=0, stop=None, step=1):
    if stop is None:
        stop = len(list_)
    for i in range(start, stop, step):
        yield list_[i]


sum(list_iterator(my_list, 10, 21))

Мои пять копеек: в itertools нет эффективного итератора по части списка.
Допустим, нужно посчитать сумму элементов с 10 по 20.
1. sum(my_list[10:21]) - лучший вариант, но он тратит доп. память
2. sum(itertools.islice(my_list, 10, 21)) - не эффективно по времени, т.к. начинает перебирать элементы с 0
3. Эффективно, но уродливо:
sum_ = 0
for i in range(10, 21):
sum_ += my_list[i]

https://github.com/danthedeckie/simpleeval - готовое решение для eval, из которого вырезаны все опасные штуки

class AsyncTimer:

def __enter__(self):

async def __aexit__(self, exc_type, exc_val, exc_tb):


С такой комбинацией дандеров это в принципе не контекст менеджер.

Тоже покоробило это. Автор в одной строчке пишет нормально через [ ] и в следующей его резко заносит в куда-то в жаву с треугольными скобками. В питоне такого нет и было бы глупо вводить

Information

Rating
1,511-th
Registered
Activity