Pull to refresh
3
0

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

Send message

Вы бы уж целиком запостили, раз такая пьянка. Наверняка собрало бы ветку комментарием и кучу плюсов.

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

хотел бы иметь комментариями минимум 30 процентов текста. Чтобы я мог если надо быстро передать текст другому разработчику

А вы уже пробовали? Как результаты?

у YAML нет никакой семантики на этапе задания конфига, IDE пофиг, по сути, что вы на нем пишете

Эту проблему решает json schema. Описывается формат файла, в IDE указывается, что у этого конфига вот этот файл схемы, и начинает работать автодополнение и валидация.

Я использую Pydantic для разбора и валидации конфига, и оказалось, что даже описывать не нужно, schema_json() выдает готовую схему, которую PyCharm подхватывает без проблем.

Я вам больше скажу, процесс установки на Линукс выглядит точно так же: распоследний Python, venv, pip install, найти и починить ошибки в логах. Только скрипт автозапуска меняется на unit-файл systemd при наличии последнего.

А вы доверяете обещанию API опубликовать сообщение прямо сейчас, если вы его об этом попросите? Будете проверять, что пост действительно появился, а не просто статус ответа?

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

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

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

Не так уж и заметно, оказывается. Если рассчитать сумму цифр возможных значений октета заранее, то выходит 4:28 на моей машине.

Hidden text
sum_of_digits = [sum(int(x) for x in str(number)) for number in range(256)]
counter = 0
octet = tuple(range(0, 256))
for i1 in range(1, 256):
    print (f"{i1}", end='\n')
    for i2 in octet:
        for i3 in octet:
            for i4 in octet:
                if sum_of_digits[i1] + sum_of_digits[i2] == sum_of_digits[i3] + sum_of_digits[i4]:
                    counter += 1
print(counter)

Если переписать на C, то получается (на более слабой машине)

real    0m9.139s
user    0m9.133s
sys     0m0.005s

Вы считаете сумму октетов, а не сумму цифр в октетах, это заметно быстрее.

Проблему с очень большим дублированием решает gzip. Если использовать logrotate, то сжатие будет буквально из коробки, при этом будут доступны все привычные способы анализа текстовых файлов. Хранением логов в бинарной форме занимается journald и мне совершенно не кажется, что он быстрее.

Для человека, который знает Python и не знает Lua, первый будет полезнее второго буквально во всем. У Python относительно богатая стандартная библиотека, которая даже после обрезания того, что не лезет в формат макросов, будет функциональней Lua, не говоря уж о возможности встраивать сторонние библиотеки.

Selenium заканчивается когда защита начинает его детектировать и отказывается пропускать дальше. Начиная с проверки navigator.webdriver и далее кто на что горазд.

Самое интересное и не рассказали: что вы делали когда Selenium закончился?
Как боролись с Cloudflare и прочей рекапчей? Сталкивались ли с банами по принадлежности подсети к датацентру? А по геолокации? Что делали с данными вроде телефона продавца, которые отображаются только для залогиненных пользователей? Что парсите, html или какое-то представление DOM? Чем парсите, lxml, суп или что-то еще? Как парсите, CSS-селекторы, xpath, регулярки?

Опенсорс либо открыт для всех либо он не опенсорс.

По вашей логике код под GPL - не опенсорс.

Если взять код, работающий с классом, реализующим интерфейс BaseRunner, и подсунуть ему реализацию PeriodicRunner:

config = BaseConfig(name='test runner')
runner = PeriodicRunner(config)
runner.run()

то все сломается, потому что у них разная сигнатура:

    sleep(self.conf.period)
AttributeError: 'BaseConfig' object has no attribute 'period'

Это определенно нарушает LSP.

Вот у меня есть конкретный вопрос: как быть со вспомогательными (дата)классами-зависимостями?

Скажем, класс BaseRunner хранит настройки в BaseConfig:

@dataclass
class BaseConfig:
  name: str

class BaseRunner(ABC):
  def __init__(self, conf: BaseConfig):
    self.conf = conf
    
  @abstractmethod
  def run(self):
    """do work here"""

Добавляем более конкретный интерфейс PeriodicRunner. У него помимо общих с предком есть свои настройки, соответственно, у него свой конфиг:

class PeriodicConfig(BaseConfig):
    name: str
    period: int

class PeriodicRunner(BaseRunner, ABC):
    def __init__(self, conf: PeriodicConfig):
        super().__init__(conf)

    def run(self):
        while True:
            self.run_once()
            sleep(self.conf.period)

    @abstractmethod
    def run_once(self):
        """do work once here"""

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

Возможно ли вынести состояние/конфигурацию в отдельный датакласс не нарушая принципа подстановки Лисков?

Step 3
In this step your goal is to allow the user of your sort program to select which sort algorithm to use. Checking man sort, we see that the standard Unix version offers radix sort, merge sort, quicksort and heapsort.

Step 4
In this step your goal is to implement random sort.

Сколько из них есть в стандартной библиотеке того же Питона?

Coding Challenges – отличный ресурс с задачами, подходящими под эти требования.

Открываем список тем: "Write Your Own Compression Tool", "Write Your Own Sort Tool", "Write Your Own Calculator". Ближе к концу: "Write Your Own Lisp Interpreter".

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

Странная статья. Те, кому приходится программировать ПЛК, и так это знают из практики, а для "предотвращения простоев, возникающих в результате правильного программирования ПЛК" придется таки изучить мануал на конкретный контроллер, потому что даже из самой статьи хорошо видно, что стандартизацией тут и не пахнет.

Information

Rating
4,477-th
Registered
Activity