Местоположение
Россия

Достижения

Все достижения (4)

Наибольший вклад в теги

Все теги (56)

Лучшие ответы пользователя

Все ответы (93)
  • Как работает данный код?

    @antares4045
    ну вообще, писавший этот код, вероятно не очень здоров
    для начала предлагаю разобраться с деструктуризацией

    если вы напишите
    a,b = 2,3
    то в переменной a окажется значение 2
    а в переменной b -- значение 3

    это же можно использовать в циклах:
    words = [(0,'What'),(1,'the'),(2,'heck?')]
    for key,word in words:
        print('key:', key)
        print('word:', word)
        print()

    вывод:
    key: 0
    word: What

    key: 1
    word: the

    key: 2
    word: heck?


    если же при разборе кортежа, какой-то элемент вам не нужет, то можно просто использовать нижнее подчёркивание

    words = [(0,'What'),(1,'the'),(2,'heck?')]
    
    for _,word in words:
        print(word)


    Но автор вашего примера решил сделать нечто странное:
    {} -- создание пустого dict
    [()] -- присвоение в него по ключу "пустой кортеж" значения

    учитывая, что исходный dict никуда не сохраняется, это можно считать отчисткой, только вот зачем?
    a = {}
    a[()] = 5
    print(a)


    {(): 5}
    Ответ написан
    Комментировать
  • Не устарел ли ещё курс Скиллбокс "Веб-верстка" декабря 2020 года?

    @antares4045
    У меня родственник решил потратить деньги на этот курс: акценты сильно смещены в сторону бесполезных свистоперлелок типа pixel perfect, и nvda, которые фронтендер, только сошедший с конвера ещё несколько лет не вкусит (а может и вообще никогда).
    + полностью отсутствует практика верстки не лендингов (внезапно, если на сайте будет больше одной страницы, есть куча специфики, с которой вам прийдётся знакомиться сразу на боевом проекте).

    Но (особенно после обновления зимы 20-21 (когда оно точно было не помню)) вся ключевая информация в курсе освнщена. Тем не менее фокус на ванильном html+js там совершенно излишен. Клиент и работодатель сейчас хотят реакт (большие компании вообще ангуляр).
    Ответ написан
    1 комментарий
  • Как использовать sqlite python в многопоточности?

    @antares4045
    Коннект надо поднять ОДИН раз в главном потоке а курсоров из него уже можете понаделать на все потоки (вроде). Если не поможет: то только открывать-закрывать подключение для каждой операции, например так: https://qna.habr.com/q/1062578#answer_2040432.

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

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

    В абсолютно любой файловой системе многопоточный доступ к одному файлу не существует. совсем. программа может считать файл (или его часть) в оперативную память, а потом заменить файл на что-то вычисленное на основе считанного (есть ещё возможность делать "аппенд", но это синтаксический сахар реализованный на уровне ос (возможно я не прав: знатоки поправьте меня)).

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

    Sqlite это просто файл у вас на диске, и еcли бы не та защита которая вам не даёт создать многопоточную программу, то вам бы казалось, что она вообще не работает: каждый поток видит в базе только то, что сделал в базе он сам, а после перезапуска вы вообще видите в лучшем случае версию базы от потока, закрывшего соединение последним (а то и вообще битый файл).
    Для того, чтобы всякие профессионалы не писали, что "этим вашим sqlite не возможно пользоваться", была встроена защита (куда более адекватный аналог которой есть на всех файлах microsoft office) если хоть кто-то сейчас работает с файлом, то его открывать нельзя и, если не оговорено обратное, падает с ошибкой.

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

    Правила организации этих очередей целая наука от которой сойти с ума можно, но в случае sqlite настраиваемый параметр у нас ровно один: сколько мы готовы ждать.

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

    cursor.execute(clause, props)
    result = cursor.fetchall()

    или что там у вас было пишем

    with sqlite3.connect(`Ваши параметры подключения`, timeout=`Какое-то зверски большое число секунд, которое мы готовы "стоять в очереди"`) as connect: 
      # создаём подключение к базе которое существует только в рамках блока with 
      # то что мы здесь напишем должно отработать максимально быстро
      cursor = connect.cursor()
      cursor.execute(clause, props)
      result = cursor.fetchall()

    В идеале вообще вынесите это в отдельную функцию

    p.s. если вы зашли сюда в поисках истины, то мы продолжили общение тут и в итоге победили.
    Ответ написан
    9 комментариев
  • В чем преимущество функций-конструкторов?

    @antares4045
    Разница в механике наследования: первый вариант можно унаследовать, и ему в прототип можно добавлять методы.

    в первом случае, если вы захотите добавить метод, который выводит имя в консоль, то вам будет достаточно
    написать
    Func.prototype.printName = function(){
      console.log(this.name)
    }


    и затем можете обращаться к методу
    a.printName() // выведет в консоль Victoria
    При всём при том, не зависимо от того, сколько экземпляров класса Func вы наплодите метод printName в памяти будет храниться один.

    Во втором случае вы также при помощи несложных манипуляций сможете добиться похожего поведения, но там всегда будут подводные камни, например скорее всего у вас не получится создать наследника для func
    Ответ написан
    Комментировать
  • Как написать приложение на c++?

    @antares4045
    если вам нужно чистое c++, то любая os предоставляет api: просто вбиваете в поисковик что-то вроде
    "c++ windows create window" и получаете пачку ссылок на официальные мануалы и популистические статьи.

    но это на самом деле путь в бездну. от себя могу порекомендовать фреймворк qt (он кроссплатформенный и его интерфейсы гораздо более соответствуют языку c++ (интерфейсы OS слииишком сишные))

    а иконка на рабочем столе -- это просто специальный файл, говорящий выполнить определённую команду (как правило -- запуск экзешника) можете поэкспериментировать и руками посоздавать иконки на рабочем столе к вашим консольным играм.
    Если же вас интересует, как сделать установщик -- то именно такие слова и рекомендую вбить в поисковик.
    Я для своих плюсовых проектов обычно использую InnoSetup.
    Ответ написан
    Комментировать