• Как создать метаклас в зависимости от env переменной?

    @Zanak
    А зачем метакласс? Чтобы закрепить интерфейс, достаточно породится от абстрактного родительского класса. А для постройки конкретного класса - шаблон "фабрика" вам в помощь.
    Как вариант - можете поиграться с importlib и грузить модули по имени, в стиле а-ля плагин.
    Ответ написан
    Комментировать
  • Когда стоит начинать изучать ООП в PHP?

    @Zanak
    Описание объектов, как языковая конструкция, имеет 2 предназначения.
    Объекты, как способ организации кода. Мы в одном месте помещаем все данные и функции по их спользованию, относящиеся к одной функциональной части приложения. Синтаксис объявления объектов логично изучить где - то после синтаксиса описания функций.
    Объекты, как способ проектирования сложных приложений, вы будете осваивать позже, когда синтаксис совсем освоите. Первые, с чем, скорее всего, познакомитесь будут шаблоны проектирования. Шаблоны - это типовые способы использования большого количества разных объектов. Многие web фреймворки реализуют известный шаблон MVС, который предлагает разделять приложение на части (M - model, здесь все для работы с данными, V - view, здесь все для отображения данных модели, C - controller, это тот, кто использует модель для получения данных и view для его правильного отображения, например, в виде json, вместо полноценной страницы, в ответ на запрос пользователя). Использование шаблона для построения приложения не ограничивает нас в использовании других шаблонов для его частей. Например ORM, популярный шаблон по работе с БД. Самому вам врядли придется его реализовывать, но вот использовать чужие реализации, почти наверняка. Со временем вы научитесь не только выделять типовые шаблоны в задаче, при проектировании решения, но и в коде ваших коллег, для анализа не только каждой отдельной функции, но и устройства приложения в целом.
    Ответ написан
    Комментировать
  • Как проверить в библиотеке (jsonwebtoken) истёк ключ или нет?

    @Zanak
    Батенька, ну вот жеш, в документации: https://github.com/auth0/node-jsonwebtoken#token-e....
    Ответ написан
    Комментировать
  • Что лучше flask или Django?

    @Zanak
    Каждый фреймворк имеет свое комьюнити, которое будет топить за него.
    Единственное отличие джанги от многих, если не всех, фреймворков - это наличие админки из коробки (на мой взгляд - достаточно типовой админки, и если ваш проект подразумевает широкие возможности для администрирования, то лучше этот момент не рассматривать). Если админка не актуальна, например, вы пишите чистый api и убираете всю отрисовку на сторону клиента, то здесь выбор сильно расширяется и flask с django становятся одним из возможных вариантов.
    Мегаглобальных различий между сабжевыми фреймворками по удобству, наличию информации, готовых модулей, или отзывчивости комьюнити в общем - то нет. Говорят, что flask быстрее, но сам не мерил, поэтому наверняка сказать не могу.
    Выбирайте что вам ближе, и более подходит для решения именно вашей задачи и вперед.
    Ответ написан
    Комментировать
  • Процессы работают на различных ядрах процессора или нет?

    @Zanak
    Для ОС почти нет принципиальной разницы между процессом и потоком. При создании процесса происходит выделение нового куска памяти, при создании потока - это не обязательно происходит, поток имеет доступ к памяти родителя, процесс нет. Тоесть, в контексте вопроса можно ограничится разговором о потоках.
    Потоков может быть столько, сколько позволяет память, даже на однопроцессорной и одноядерной железке.
    Активность потоков может управляться на нескольких уровнях. Во первых, ОС может в любой момент тормазнуть исполнение потока. Даже если этому и можно помешать, врядли это легко, да и врядли нужно это делать. Среды исполнения, иногда, позволяют указать, сколько потоков запустить для исполнения программы. Например среда исполнения erlang или go позволяет программам создавать не дорогие потоки ОС, на создание которых уходит масса времени, а более легкие, жизненным циклом которых сама среда и управляет. Происходит отображение N потоков программы на M потоков ОС, которые запрашиваются один раз, при старте.
    Поток может находится в одном из состояний: спит - когда планировщик его остановил, активен - когда поток получил управление, заблокирован - когда поток ждет какое - то событие или окончание какого - то действия, например прихода данных по сети, ошибка - когда происходит обработка ошибки или освобождение ресурсов и смерть потока.
    Вопрос оптимальности создания более одного потока/процесса всегда следует рассматривать в контексте конкретной задачи. Даже при неблокирующем обмене данными между потоками, как минимум, переключение потоков, если речь не идет о количестве потоков меньше или равном количеству присутствующих ядер, имеет свою цену по времени. Подозреваю, многопоточная программа начинает выигрывать у однопоточной, когда количество потоков, которым надо исполнятся паралельно не превосходит количество доступных ядер. Как только потоков становится больше, в дело приходится вступать планировщику, и естественно, он работает не мгновенно.
    Вопрос оптимальности архитектуры тоже, на мой взгляд, не имеет общего ответа. Для вычислительных задач может оказаться сравнимо, использовать один двухядерный процессор, или материнку с поддержкой 2 процессоров, а, например, для запуска веб сервера и БД к нему вообще лучшим вариантом может оказаться два независимых компютера.
    Ответ написан
    Комментировать
  • Что случится с программой (Go, Python, JS, PHP), если потребуется выделить память, а оперативная память в ОС закончилась?

    @Zanak
    Ответ на ваш вопрос складывается из ответа на два других:
    - В чем суть работы менеджера виртуальной памяти?
    - Может ли один процесс запросить у менеджера памяти больше, чем процессор в состоянии адресовать, исходя из его архитектуры?
    Ответ на первый вопрос: думаю, обеспечить паралельное исполнение приложений, запущеных ОС. происходит это за счет выгрузки отдельных частей не исполняемых, в данный момент, процессором приложений, чтобы обеспечить потребности активных.
    Ответ на второй: думаю не может. выгрузка страниц на диск все равно подразумевает их возврат в память по тому адресу, откуда страница была свапнута. наличие 2 страниц памяти, относящихся к одному физическому адресу и процессу открывает шанс на потребность их одновременной загрузки, что невозможно.
    Вместо резюме: реакция ОС на "прожорливость" процесса может различаться. У linux есть OOM killer, который прибивает "зажравшиеся" процессы. Форточки позволяют запрашивать память пока место на диске не заканчивается исключительно потому, что работает, обычно, более одного процесса, и каждый из них может занять до максимально адресуемого, для текущей архитектуры, куска виртуальной памяти.
    Ответ написан
    Комментировать
  • Кастомная валидация vs использование Pydantic?

    @Zanak
    Если у вас только один класс, то большой разницы не вижу, руками, или с помощью библиотеки.
    Если у вас возможна потребность в проверке +100500 классов, тогда точно выбор за специальным инструментом, например педантик.
    Ответ написан
    Комментировать
  • McRCON - Выдает ошибку при правильном коде, где проблема?

    @Zanak
    Не может найти имя для открытия соединения. Проверте наличие имени в DNS.
    Ответ написан
    Комментировать
  • Как сделать ожидание сообщения?

    @Zanak
    Если это
    If event.text.lower() == ‘Промокод’:
        ...

    копипаста из вашей попытки решить вопрос, то условие ни когда не сработает.
    По api вконтакте не специалист, но правдоподобный ответ легко гуглится.
    Ответ написан
    Комментировать
  • Стоит ли размещать логику импортов в __init__.py?

    @Zanak
    Основная задача __init__.py - это настройка импорта твоего пакета в основной код. Ты можешь как угодно тусовать модули и пакеты нижнего уровня и скрыть этот факт за отдачей в виде "from your_package import *" с помощью init файла.
    Нет ни чего предосудительного, если в этом файле будует присутствовать код инициализации, но определенную осторожнось соблюдать следует. Например, можно, случайно, получить цикл при импорте модулей. Другой пример, мы используем модели, которые используют соединение с БД, которое открывается позже.
    Опять же, возможно это только мои проблемы, я сходу не могу сказать, сколько раз выполнится код инициализации, если модуль импортируется более более 1 раза, и отработает ли ваша логика, если в одном случае это "from your_module import *", в другом "from your_module import name1, name2", а в третьем "import your_module as ym".
    Ответ написан
    Комментировать
  • Как встроить итератор или генератор в уже написанный парсер python?

    @Zanak
    1. Понять, по каким данным желаем итерировать. Если по разобранным данным, то меняем parse_file/counter чтобы она возвращала результат разбора, если по результатам расчета, то создаем метод/методы, для реализации генератора/итератора.
    2. Все подготовительные операции должны быть сделаны до начала возможных итераций. Как минимум - это открыть файл, как максимум - произвести предварительный расчет.
    3. В случае генератора мы правим counter или result, чтобы она использовала yield current_value для отдачи вызывающей стороне текущего значения (в зависимости от того, что хотим возвращать).
    4. В случае итератора реализуем __iter__ и __next__ методы, первый вернет собственно сам итератор, а второй возвращает текущее значение. За подробностями предлагаю сходить в документацию :)

    Вроде ни чего не забыл. :)
    Ответ написан
    Комментировать
  • Как мне расширить конструктор класса X конструктором класса N?

    @Zanak
    Не очень понял, при каких обстоятельствах возник этот кейс, поэтому вопросы:
    - расширить класс X до класса N разве не означает, что N является потомком X?
    - в методе handler родитель создает инстанс потомка, вы уверены, что это правильно?

    Здесь, на мой взгляд, напрашивается наследование или инкапсуляция.
    Если CmdHandler расширяет Server, то можно использовать наследование, утащив общие методы и данные в родительский класс.
    Если классы предназначены для взаимодействия, и их функционал не пересекается, то, я бы, посмотрел в сторону передачи инстанса обработчика конструктору сервера или отдельному методу регистрации в инстансе.
    Ответ написан
    Комментировать
  • Как умножить каждый элемент списка на разные числа?

    @Zanak
    zip забыли :)

    l1 = [1, 2, 3, 4, 5, 6, 7]
    l2 = [5, 4, 8, 3, 7, 8, 9]
    l3 = [l * r for (l, r) in zip(l1, l2)]
    print(l3)
    Ответ написан
    Комментировать
  • Как сделать задержку перед повторной отправкой формы?

    @Zanak
    Для простых случаев подойдет localStorage, но, что легко создается, легко же и отламывается.
    Для более сложных случаев надо смотреть, какие требования предъявляются.
    Например, если пользователь перед отправкой сообщения авторизуется, то, самое надежное - это, например в редиску, положить информацию, что пользователь такой - то недавно уже постил в такой - то ветке. Время жизни ключа будет определять длительность запрета на повторное комментирование.
    Для случая, когда пользователь может оставаться неавторизованным - надо подумать. Что точно стоит заблокировать - это прямой заход на форму по ссылке. Необходимость запрашивать несколько страниц с сайта, да еще в определенном порядке - это хотя бы немного осложнит жизнь потенциальному спамеру.
    Ответ написан
    Комментировать
  • Как подключить свой UI к FastAPI?

    @Zanak
    Давайте, для начала, поймем ваши цели. Вы хотите создать свой API, пообщаться с существующим, или приделать свой UI для известного API?

    Для создания своего API указанный инструмент, FastAPI, вполне подходит. Не все фреймворки умеют формировать/отдавать swagger спеку, но некоторые это позволяют. Собственно, для создания собственного сервиса и API, по которому он будет отдавать данные, swagger непременным условием не является. Спека для swagger пишется первой, когда у вас есть генератор, который может построить заготовку проекта на нужном вам языке. Во всех остальных случаях, она, или пишется вручную, или формируется по написанному коду, с использованием соответствующих инструментов.

    Пообщаться с существующим API можно, помимо, например, Postman-а и подобных инструментов, с помощью SwaggerUI, который написан на JS и может быть размещен, например, на вашем сервере. Достаточно подсунуть ему спеку интересующего вас сервера и он, в более или менее удобной форме, позволит увидеть доступные вызовы, отправить запрос, получить ответ, ну и прочитать описание каждого вызова, если автор спеки об этом позаботился. Задача swagger - это представить машинно понятное описание api, со всеми используемыми структурами запросов и ответов, чтобы клиентский код сумел его разобрать, отправить запрос, обработать ответ, и возможно, по крайней мере теоретически, сформировать форму, чтобы пользователь мог ввести свои данные, например, для отправки их в БД. Ни для чего больше, как машинно понятное описание API swagger не предназначен.

    Ну и уже должно быть понятно, что SwaggerUI не предназначен для создания собственных клиентов к API. Это скорее интерактивная документация к сервису, который описан в спеке.

    В выборе средств реализации пользовательского UI вы не ограничены ни чем. Мобильное приложение, десктоп, веб с шаблонами a-la django, spa приложение, все к вашим услугам. На реализацию серверной части это ни как не завязано.
    Ответ написан
    Комментировать
  • Почему не работает postgreSQL?

    @Zanak
    Постгри вы установили?
    Обычный порт для постгри - это 5432. Когда pgadmin-у указываете localhost и этот порт соединение происходит? Для пользователя postgres с паролем, указанным при инсталяции, авторизация проходит?
    Добейтесь успешного соединения с помощью psql или pgadmin, потом беритесь за питон. Будет реально быстрее, в смысле понимания, что именно не пошло.
    Ответ написан
    Комментировать
  • Как заполнить эту трассировочную таблицу по псевдокоду?

    @Zanak
    Мы перекладываем элементы из Items в Newitems, при условии, что они прежде не встречались (done = false). Чтобы заполнить требуемую табличку нужно знать содержимое Items, потому что оно может быть и [1, 1, 1, 1], тогда в результате получим NewItems = [1], а может и [1, 2, 3, 4], тогда он будет перенесен целиком.
    И таки да, если я правильно понимаю псевдокод, то ошибок в нем нет.
    Ответ написан
    Комментировать
  • Как "заставить" функции выполнятся после условий, если сначала их нужно написать?

    @Zanak
    Если я правильно понял вопрос, то ваша проблема здесь:
    figures = {'1': triangle(point=point, angle=0, length=200), '2': square(point=point, angle=0, length=200),
               '3': pentangle(point, angle=0, length=100), '4': sixangle(point=point, angle=0, length=100)}

    Вы вместо ссылки на функцию сохраняете результат ее вызова, и так для каждого ключа.
    Ответ написан
    Комментировать
  • В чем разница multithreading, multiprocessing и асинхронности?

    @Zanak
    Почитал ответы коллег, и решил вставить свои 5 копеек:
    - multiprocessing. каждая задача - это полноценный процесс ОС. процессы могут быть одинаковые, или абсолютно разные. для взаимодействия между процессами используются сокеты (про udp тактично промолчим). сокеты бывают 2 видов, сетевые и unix (юникс сокеты, естественно, присутствуют на юникс системах, под windows возможно присутствует аналогичный механизм IPC, но я не в теме, поэтому не стану сбивать вас с толку). принципиальное отличие для сокетов - это то, что через юникс сокеты взаимодействие возможно только в пределах одной машины, для сетевых сокетов такого ограничения нет.
    - multithreading. главное отличие от процессов - нельзя создать самостоятельный поток, всегда сначала стартует процесс, который это делает. с точки зрения планировщика ОС отличие потоков от процессов весьма небольшое - процессы стартуют каждый в своем адресном пространстве, со своим стеком и дескрипторами. все потоки, делят адресное пространство с родителем и другими потоками. из плюсов - взаимодействие между потоками максимально быстрое, его возможности ограничены только фантазией автора программы. из минусов - взаимодействие между потоками возможно только в рамках одной программы, взаимодействие со внешним миром не отличается от случая множества процессов, из за того, что все данные доступны всем потокам сразу, приходится использовать специальные техники программирования с участием блокировок.
    - асинхрон. асинхронное програмирование - это есть ни что иное, как кооперативная многозадачность. всегда есть диспетчер, который умеет переключать асинхронные задачи. в некоторых новомодных языках, вроде go, компилятор неявно вставляет вызовы диспетчера, чтобы горутины могли исполнятся паралельно. в языках, где поддержка асинхронности появилась позже, чем сам язык приходится в явном виде указывать вызываем мы синхронный или асинхронный код. при вызове асинхронного кода происходит вызов планировщика, который добавляет запрошенную функцию в очередь и производит переключение на другую задачу. иногда приходится в явном виде обращаться к диспетчеру, если, например, наша асинхронная задача будет исполняться заведомо долго.
    Ответ написан
    Комментировать
  • Как найти все возможные комбинации чисел от 1 до n-1 чтобы их сумма была равна n?

    @Zanak
    Такой вариант вроде работает:
    package main
    
    import "fmt"
    
    func sum(s []int) int {
    	result := 0
    	for _, v := range s {
    		result = result + v
    	}
    	return result
    }
    
    func main() {
    	n := 10000
    	var stack []int
    	p := n - 1
    	for p > 0 {
    		stack = append(stack, p)
    		for j := p - 1; j > 0; j-- {
    			stack = append(stack, j)
    			cur := sum(stack)
    			if cur < n {
    				continue
    			} else if cur == n {
    				fmt.Printf("%++v\n", stack)
    			}
    			stack = stack[:len(stack)-1]
    		}
    		stack = nil
    		p--
    	}
    }


    Прошу прощения, на node не пишу.
    Ответ написан