Ну хотя бы тем, что малейшее изменение выводимой английской строки (или какой там язык мы используем как оригинал) потребует кучи работы по обновлению соответствующих ключей в других локализациях...
Человек перешел на сайт (или куда то там еще, не важно), ввел данные, нарисовался чертеж, сохранил картинку, скинул,
Ну блин, это всё меняет же. Такое даже на питоне делать не нужно, JS+Canvas.
Только вот скрипт, боюсь, споткнётся на первой же непредусмотренной хотелке "с перламутровыми пуговицами"...
Иван, дело именно в динамическом наследовании.
Ведь наследование обычно подразумевает что? "Утверждение, справедливое для предка, будет справедливым для потомка". Если предок заранее неизвестен, то нам неизвестно, что ожидать от потомка.
Впрочем, если я правильно понял, что вы хотите сделать, то тут скорее mix-in чем обычное наследование.
Я видел подобное в Pydle (IRC библиотека для питона), которая использует миксины для добавления поддерживаемых фич в класс-клиент.
Артур Samurai, а, блин, проглядел спойлер!
Ну всё логично, чего. pr() обращается к полю ввода self.console, а потому ссылку приходится пробрасывать в другой процесс, с чем возникают проблемы.
Сейчас перепишу ответ.
Вообще насколько я понял из кода, rect тут определён как прямоугольная область на изображении. Вполне возможно, что он не позволяет дробные координаты (где ты найдешь пол пикслеля?).
Артур Samurai, ну тогда полный код, а лучше минимальный проблемный пример, в студию. Есть пара неясных моментов:
1) что у тебя в if __name__ == "__main__": завернуто
2) к чему именно обращается pr() за всё время своей работы
Касательно 1 - имей ввиду, что при мультипроцессинге твой скрипт как бы "импортирует сам себя", так что код, который не должен выполняться в дочерних скриптах (только в родительском), нужно заворачивать в if.
SemenAnnigilator, идея семантической сегментации простая - мы классифицируем каждый пиксель изображения о его окрестности. Обычно это делается чем-то быстродействующим, например, решающим лесом - но можно и обычной нейронкой, я полагаю.
Что касается свёрточных сетей, то их можно пробовать обучать так.
Для заданного входного изображения сам формируешь выходную карту (закрашиваешь bounding box известных объектов), и эту пару изображений уже используешь для обучения.
SemenAnnigilator, начни со свёрточных нейронных сетей (CNN, convolutional neural networks). По ходу поисков можешь наткнуться на что-то более новое, но это достаточно простая в понимании точка старта.
Ещё одно ключевое слово для поиска - семантическая сегментация (semantic segmentation)
Артур Samurai, "передаю в Process функцию pr." - к чему эта функция обращается? Она получает два аргумента, я вижу, но если она дёргает что-то связанное с Tkinterом из self, то это может быть проблемой.
PeteDoherty, перефразирую.
Просто в следующий раз, задавая вопрос, приводи полный трейсбэк ошибки, в т.ч. номер строки и саму строку. Листать страницу кода туда сюда, пытаясь указать, какая именно операция со словарём даёт ошибку - удовольствие ниже среднего.
Если у тебя нет трейсбэка, то его получение должно быть первоочередной задачей.
Если нужно, чтобы эта информация пережила перезапуск бота - то сразу используй БД. Можно sqlite3, она в питоне есть встроенная.
Только сначала про основы SQL почитай, а то шишек набьёшь немеряно.
Для решения этой задачи сортировка не нужна, разве что для красоты при выводе.
В любом случае, структуру таблиц и свой код в студию. Код оформи кнопкой </>.
NekIT, тебя ошибка прямо говорит: ban() takes 1 positional argument but 2 were given
Нужно иметь ввиду, что у методов объектов первый аргумент - всегда self, объект, у которого этот метод вызывается. Так что по факту это сообщение следует понимать так: ban() принимает 1-1 = 0 позиционных аргументов, а получил при вызове 2-1 = 1 аргумент. Т.е. у тебя один лишний позиционный аргумент.
Смотрим документацию:
await ban(**kwargs)
В сигнатуре действительно нет позиционных аргументов, только **kwargs, т.е. некий набор keyword аргументов.
Смотрим еще раз твой вызов:
await member.ban(member, delete_message_days=0)
У тебя есть 1 позиционный аргумент member, и один keyword аргумент delete_message_days.
При этом мало того, что документация говорит "позиционных аргументов быть не должно", но и просто по логике тебе незачем иметь этот аргумент. Он указывает, кого банить - но так как мы вызываем метод на объекте Member, т.е. на участнике, значит, по логике, вызов метода ban() должен банить именно этого участника.
Вот если бы ты вызывал метод ban() на объекте Guild, там набор параметров другой, и указывать member необходимо. Документация это подтверждает.
Если есть трудности с построением таких логических цепочек, отложи бота, и потренируйся на более простых примерах по Питону в целом и ООП в частности.