Андрей, ну и ещё одна вещь, на которой я погорел в своё время.
INSERT OR REPLACE при наличии строки удаляет её и вставляет новую. Если у тебя есть ссылки по внешнему ключу на эту строку, и настроено каскадное удаление - потеряешь все строки, ссылающиеся на "обновляемую".
Может быть предпочтительно использовать INSERT INTO ... ON CONFLICT DO UPDATE.
Андрей, ещё одна проверка. Выполни на своей базе данных такой запрос (можно клиентом sqlite или отдельным скриптом на питоне):
SELECT sql FROM sqlite_schema WHERE type = 'table' AND tbl_name = 'persons'
Отпишись, совпадает ли результат с твоим запросом на создание таблицы.
Поясню почему: если у тебя таблица persons уже была создана с другими настройками, CREATE TABLE IF NOT EXISTS её не переделает, а оставит как есть. Т.е. столбцы могут быть другими, индексы могут быть другими и т.п.
Ну для начала оцени, где именно узкое место. Замерь время выполнения каждого шага.
Может, у тебя не скачивание тормозит, а сам парсинг медленный. Что вообще происходит в parse_item()?
Не, ну ты реши уже. Или listtak - это строка, и тогда у неё не может быть метода append().
Или listtak - это список, и тогда у него не может быть метода lower().
Если на то пошло, многократная конкатенация - это не очень хорошо. join() на списке куда эффективнее и по памяти, и по скорости, а в понимании - ничуть не сложнее.
stan288, а что не так? Всё логично.
Функция f1() планирует выполнение асинхронное операции и указывает, что делать по её окончанию. Она НЕ стоит и ждёт выполнения этой операции - только указывает callback, который нужно вызвать, когда в будущем операция выполнится.
Дальше идёт выполнение f2() и f3(), это обычные синхронные функции.
А потом, спустя какое-то время, завершается работа операции, созданной через fetch(), и отрабатывает callback, который мы указали.
Т.е. ещё раз: fetch() отрабатывает сразу (но только планирует выполнение сетевой операции). then() отрабатывает сразу (но только планирует выполнение переданного ему callback по завершению операции).
Сама операция отрабатывает тогда, когда сможет. До тех пор может выполниться какой-нибудь другой код.
Callback отрабатывает тогда, когда операция выполнится.
Тут не нужен метакласс. Достаточно дерева наследников "абстрактного хранилища", и словаря, который связывает значения env переменной с этими наследниками. В словарь вполне можно поместить класс, а не только экземпляр.
Xliteee, включить логику.
У тебя код программы предусматривает хранение одного ID отправителя (truechanid) и одно ID получателя (truechatid). Аналогично, при чтении ты перезаписываешь значение этих ID неоднократно, так что в итоге в переменной останется значение, соответствующее последней строке файла.
Так что нет вообще никакого задела на то, чтобы ID было несколько.
Поэтому ответ - никак, без кардинальной правки программы.
Исходи из того, что у тебя есть набор пар значений (ID отправителя - ID получателя), и тебе нужно по первому элементу (ключу) определить второй (значение). В питоне это обычно решается с помощью словаря (dict). А дальше уже решаешь вопросы:
- как загрузить/сохранить словарь? (подсказка: см. модуль json)
- как проверить, что в словаре есть данный ключ? (читай документацию)
- как получить значение по ключу? (читай документацию)
GavriKos, тоже мысль. Опять же, есть pymem, он вполне удобен.
А если текст не рендерится как текстура, а выводится в условном поле ввода (Edit), то и GetWindowText() хватит. Но тут уже нужно знать, о какой программе речь.
Avasov, почему не решает?
У тебя в таблице ПроизводительТипа как раз и записаны все допустимые комбинации "тип-производитель".
Так как товар ссылается на эту таблицу через пару полей (тип и производитель), то эта пара полей сможет иметь только те комбинации значений, которые есть в таблице ПроизводительТипа.
Т.е. у ПроизводительТипа составной первичный ключ из двух полей, у Товар будет соответствующий составной внешний ключ.
Ничего. Нет такой строки, которая бы подошла.
Вместо этого почитай, как пользоваться регулярными выражениями в питоне.