Python Передача объектов между процессами
В моём проекте есть несколько объектов, у которых есть метод parse(data) принимающий на вход словарь, производящий математические вычисления с элементами словаря и раскидывающий результаты по полям объекта. Встал вопрос о распараллеливании. Асинхронизация и разделение на потоки не имеет смысла, ибо операции завязаны на процессор и следовательно нужно раскидывать по ядрам. Вылезла проблема общей памяти. То есть, мне нужно передать в дочерний процесс объект и словарь и получить назад в родительский обработанный объект. И вот незадача: внутри дочернего процесса данные корректно обрабатываются и поля заполняются. Однако в возвращенном объекте изменены только поля содержащие примитивные типы. Списки, словари и прочее остается без изменений. Код:

import multiprocessing as mp

class Container:
    value = 0
    array = [0, 1, 2]
    pairs = {0: 0, 1: 1, 2: 2}

def foo(data):
    obj, value = data
    obj.value = value
    obj.array[1] = value
    obj.pairs[1] = value
    log('Inside:',obj)
    return obj

def log(prefix: str, container: Container):
    print(prefix, container.value, container.array, container.pairs)

if __name__ == "__main__":
    container = Container()
    log('Before:', container)
    with mp.Pool(processes=1) as pool:
        result = list(pool.map(foo, [(container, 5)]))
    log('After:', result.pop())

Вывод:

Before: 0 [0, 1, 2] {0: 0, 1: 1, 2: 2}
Inside: 5 [0, 5, 2] {0: 0, 1: 5, 2: 2}
After: 5 [0, 1, 2] {0: 0, 1: 1, 2: 2}

Пробовал использовать Queue, но эффект тот же. Если кто-то сталкивался с таким же, и знает решение, подскажите пожалуйста, как передавать и изменять объекты между процессами?

Всё оказалось намного проще. Достаточно инициализировать поля в экземпляре класса, а не в самом классе, спасибо @user207200 за идею:

    def __init__(self):
        self.value = 0
        self.array = [0, 1, 2]
        self.pairs = {0: 0, 1: 1, 2: 2}

Вывод:

Before: 0 [0, 1, 2] {0: 0, 1: 1, 2: 2}
Inside: 5 [0, 5, 2] {0: 0, 1: 5, 2: 2}
After: 5 [0, 5, 2] {0: 0, 1: 5, 2: 2}

Теперь, почему это работает. При передаче объектов в другой процесс и при получении результата обратно объекты сериализуются и десериализуются. Для того, чтобы это могло делаться автоматически, у экземпляра класса должны быть видны все нужные поля. И вот в этом проблема - при десериализации питоном автоматически создаётся экземпляр класса
Container, но у него ещё нет никаких своих полей, поэтому питон не понимает, куда ему копировать те поля экземпляра класса, которые вы выставили в методе
foo. А вот если сделать нормальный инициализатор класса, эти поля у экземпляра класса появляются сразу при создании экземпляра и десериализация тогда проходит успешно.
Небольшое дополнительное разъяснение. В новый процесс отправляется копия объекта, которая для этого сериализуется при отправке её в новый процесс и при получении результата из этого процесса. При получении создаётся новый объект, в который копируются поля объекта после десериализации. В результате тут получается сразу три объекта:

исходный объект (сериализованный и переданный в новый процесс)
объект, автоматически созданный в новом процессе (в который десериализуется исходный объект)
объект, автоматически созданный после получения результата (куда десериализуется объект из нового процесса)

Ещё пояснение. При создании экземпляра класса он получает как бы копии полей класса. После изменения полей экземпляра класса эти поля начинают жить своей отдельной от класса жизнью. Это довольно тонкая тема, возможно я и сам её не до конца точно понимаю.


Как брать 1 фрагмент из базы данных Python Sqlite3 (Для Aiogram бота)
всем!
Хотел бы задать вопрос про использование библеотеки sqlite3 в python.
Я разрабатываю телеграмм бота на библеотеки aiogram, и мне нужно было создать базу данных, для хранения в ней товаров. Но столкнулся с проблемой, что я не могу брать и отправлять только что созданный объект из базы данных в телеграмм канал.
И тут я не пойму, проблема то ли в том, что бот не может отправлять сообщения в тг каналы, то ли в том, что бот не умеет брать 1 фрагмент базы данных...
коды:
база данных:

import sqlite3 as sq
from create_bot import bot
from aiogram import types, Dispatcher
import logging

def sql_start():
    global base, cur
    base = sq.connect('pizza_cool.db')
    cur = base.cursor()
    if base:
        print('Data base connect OK!')
    base.execute('CREATE TABLE IF NOT EXISTS menu(img TEXT, name TEXT PRIMARY KEY, description TEXT, price TEXT)')
    base.commit()

async def sql_add_command(state):
    async with state.proxy() as data:
        cur.execute('INSERT INTO menu VALUES (?, ?, ?, ?)', tuple(data.values()))
        base.commit()

async def sql_read(message):
    # for ret in cur.execute('SELECT * FROM menu').fetchall():
        # await bot.send_photo(message.from_user.id, ret[0], f'{ret[1]}\nОписание: {ret[2]}\nЦена: {ret[-1]}')
    for ret in cur.execute('SELECT * FROM menu').fetchall():
        await bot.send_photo(message.from_user.id, ret[0], f'{ret[1]}\nОписание: {ret[2]}\nЦена: {ret[-1]}')
    cur.execute('DELETE FROM menu WHERE name == ?', (message,))
    base.commit()

Код для внесения товаров в БД:

from aiogram import types, Dispatcher
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from create_bot import dp, bot
from aiogram.dispatcher.filters import Text
from data_base import sqlite_db
from KeyBoards import admin_cb
import logging
import sqlite3 as sq

ID = None
CHANNEL_ID = None

logging.basicConfig(level = logging.INFO)
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

class FSMAdmin(StatesGroup):
    photo = State()
    name = State()
    description = State()
    price = State()

# def sql_start():
#     global base, cur
#     base = sq.connect('pizza_cool.db')
#     cur = base.cursor()
#     if base:
#         print('Data base connect OK!')
#     base.execute('CREATE TABLE IF NOT EXISTS menu(img TEXT, name TEXT PRIMARY KEY, description TEXT, price TEXT)')
#     base.commit()
#
#
# async def sql_add_command(state):
#     async with state.proxy() as data:
#         cur.execute('INSERT INTO menu VALUES (?, ?, ?, ?)', tuple(data.values()))
#         base.commit()
#
# async def sql_read(message):
#     for ret in cur.execute('SELECT * FROM menu').fetchall():
#         await bot.send_photo(message.from_user.id, ret[0], f'{ret[1]}\nОписание: {ret[2]}\nЦена: {ret[-1]}')

# @dp.message_handler(commands=['moderator'], id_chat_admin=True)
async def make_changes_command(message: types.Message):
    global ID
    ID = message.from_user.id
    await bot.send_message(message.from_user.id, 'чего?') #reply_markup=admin_cb.button_case_admin
    logger.debug('the ansver is %r', message.text)

# @dp.message_handler(commands = 'load', state = None)
async def cm_start(message : types.Message):
    if message.from_user.id == ID:
        await FSMAdmin.photo.set()
        await message.reply('Ну ладно, Кидай фотки')

# @dp.message_handler(content_types = ['photo'], state=FSMAdmin.photo)
async def load_photo(message : types.Message, state: FSMContext):
    if message.from_user.id == ID:
        async with state.proxy() as data:
            data['photo'] = message.photo[0].file_id
        await FSMAdmin.next()
        await message.reply('Название?')

# @dp.message_handler(state=FSMAdmin.name)
async def load_name(message : types.Message, state : FSMContext):
    if message.from_user.id == ID:
        async with state.proxy() as data:
            data['name'] = message.text
        await FSMAdmin.next()
        await message.reply('Введите описание')

# @dp.message_handler(state=FSMAdmin.description)
async def load_description(message : types.Message, state : FSMContext):
    if message.from_user.id == ID:
        async with state.proxy() as data:
            data['description'] = message.text
        await FSMAdmin.next()
        await message.reply('Укажите цену')

# @dp.message_handler(state=FSMAdmin.price)
async def load_price(message : types.Message, state : FSMContext):
    if message.from_user.id == ID:
        async with state.proxy() as data:
            data['price'] = message.text
        await sqlite_db.sql_add_command(state)
        await state.finish()
# async def chouse_chat(message : types.Message, state : FSMContext):
#     if message.from_user.id == ID:
#         async with state.proxy() as data:
#             data['chat'] = message.text
#             if message.text == 'ткань':
#                 CHANNEL_ID = '-1001597797251'
#             if message.text == 'дет.обувь':
#                 CHANNEL_ID = '-1001625608148'
#             if message.text == 'муж.обувь':
#                 CHANNEL_ID = '-1001631330199'
#             if message.text == 'жен.обувь':
#                 CHANNEL_ID = '-1001572127086'
#             if message.text == 'дет.одежда':
#                 CHANNEL_ID = '-1001572740339'
#             if message.text == 'муж.одежда':
#                 CHANNEL_ID = '-1001791735254'
#             if message.text == 'жен.одежда':
#                 CHANNEL_ID = '-1001725156351'

# @dp.message_handler(state = "*", commands = 'exit')
# @dp.message_handler(Text(equals='exit', ignore_case=True), state="*")

async def cancel_handler(message : types.Message, state: FSMContext):
    if message.from_user.id == ID:
        current_state = await state.get_state()
        if current_state is None:
            return
        await state.finish()
        await message.reply('ok')

def register_handler_admin(dp : Dispatcher):
    dp.register_message_handler(cm_start, commands = ['загрузить'], state = None)
    dp.register_message_handler(load_photo, content_types = ['photo'], state = FSMAdmin.photo)
    dp.register_message_handler(load_name, state = FSMAdmin.name)
    dp.register_message_handler(load_description, state = FSMAdmin.description)
    dp.register_message_handler(load_price, state = FSMAdmin.price)
    dp.register_message_handler(cancel_handler, state='*', commands = 'cancel')
    dp.register_message_handler(cancel_handler, Text(equals='cancel', ignore_case=True), state='*')
    dp.register_message_handler(make_changes_command, commands = ['moderator'], is_chat_admin=True)

Простите, я пока что джун, и коды могут быть очень запутанными, но умоляю помогите, я уже неделю мучаюсь.....
а сейчас я в школу, так что
ЗАРАНЕЕ БЛАГОДАРЮ!
P.S. Есть и другие коды, если нужно будет что то посмотреть напишите, я отвечу, но только после 17-18(по МСК), я в школе буду

У вас функция def sql_read нигде не вызывается, соответственно и отправки сообщения не будет. Её можно вызвать в отдельном хендлере. Например:

@dp.message_handler(commands=['/пример команды'])
async def read(message: types.Message)
    await sqlite_db.sql_read(message)

В переменной ret, в цикле for у Вас кортеж. К конкретному значению можно обратиться по индексу.

await bot.send_photo(message.from_user.id, ret[0]) # 0 - нужный Вам индекс

Это если я правильно понял, что именно Вам нужно.


Привет! Discord.py event. Как мне выдавать мут человеку который использовал в сообщение слово из links_words и его замутить роль config.MutedRole
<code>
gif_word = ['.gif']
tenor_com = ['tenor.com']

@bot.event
async def on_message(msg):
   for word3 in tenor_com:
       if word3 in msg.content:
           return
       else:
           for word in likns_words:
               if word in msg.content:
                       if msg.author == bot.user:
                            pass
                       else:
                           for word2 in gif_word:
                               if word2 in msg.content:
                                   pass
                               else:
                                   await msg.delete()
                                   print(discord.author.name, 'using likns_words')
                                   await discord.author.name.add_roles(config.MutedRole)

   await bot.process_commands(msg)
</code>

Вот код, без использования гиф, он работать, если в
config.MutedRole вы получили объект роли, а в
links_words все запретные слова написаны без использования больших букв.

@bot.event
async def on_message(message):
    msg = message.content.lower()
    if msg in links_words:
        member = message.author
        member.add_roles(config.MutedRole)


Правильное написание кода (PEP 8)
Нужен совет как быстро переучиться на правильное написание кода Python по правилам PEP 8.
Я привык писать код вот так:

from random import *
for i in range (10) :
    print (randint (100000,999999))
input ()

Надо переучиться на вот такое:

import random
for i in range(10):
    print(random.randint(100000, 999999))
input()

Я знаю, что этот вопрос не для Stack Overflow, но все равно, пожалуйста, напишите, как быстро переучиться на правильный стиль.
Я работаю на смартфоне в Pydroid 3, компьютера у меня нет.

Очень хороший вопрос. Мне лично сложно читать кое-как написанный код.
Правильные шаги ниже. Если совсем нет времени или сильно неохота, то делайте только третий шаг. Усилий уйдёт меньше в этом случае, но научитесь не так быстро.

Выучите PEP-8 наизусть или близко к этому. Читайте на английском, наши переводы урезаны.

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

Пишите далее в PyCharm, он вам будет указывать на ошибки. Обдумывайте каждую их перед исправлением.


python-dateutil подсчет рабочих часов
Сегодня был задан интересный для меня вопрос о подсчете рабочего времени в минутах.
Я написал ответ основанный на использовании библиотеки
python-dateutil

from datetime import datetime
from dateutil.rrule import *
from dateutil.parser import parse

def worktime_count(start: datetime, end: datetime, unit=MINUTELY):
    return len(
        [
            *rrule(
                unit,
                start,
                until=end,
                byweekday=range(0, 5),
                byhour=range(9, 18),
                wkst=MO
            )
        ]
    )

print(
    worktime_count(
        parse('2022-05-13 17:50:00'),
        parse('2022-05-16 09:10:00')
    )
)
# 21
print(
    worktime_count(
        parse('2022-05-13 17:50:00'),
        parse('2022-05-13 18:00:00')
    )
)
# 10
# Поэтому просто -1 к результату не катит

На мой взгляд ответ должен быть 20 (думаю Вы со мной согласитесь).
Посему мой ответ я удалил

Если сделать частоту генерации точек времени посекундной и потом длину списка // 60,
то ответ будет корректным.

from datetime import datetime
from dateutil.rrule import *
from dateutil.parser import parse

def worktime_count(start: datetime, end: datetime, unit=SECONDLY):
    return len(
        [
            *rrule(
                unit,
                start,
                until=end,
                byweekday=range(0, 5),
                byhour=range(9, 18),
                wkst=MO
            )
        ]
    ) // 60

print(
    worktime_count(
        parse('2022-05-13 17:50:00'),
        parse('2022-05-16 09:10:00')
    )
)
# 20

print(
    worktime_count(
        parse('2022-05-13 17:50:00'),
        parse('2022-05-13 18:00:00')
    )
)
# 10

Может быть есть у кого мысли как добиться правильного результата при поминутной частоте?

на всякий случай ссылка на доку

@Сергей, спасибо, натолкнули на мысль.
Задача свелась к тому, чтобы не забирать последний элемент, если он находится в диапазоне рабочего времени. Для этого перед применением параметра конечной даты уменьшаем ее на минуту
<code>
from datetime import datetime
from dateutil.rrule import *
from dateutil.parser import parse
from dateutil.relativedelta import relativedelta

def worktime_count(start: datetime, end: datetime, unit=MINUTELY):
    return len(
        [
            *rrule(
                unit,
                start,
                until=end - relativedelta(minutes=1),
                byweekday=range(0, 5),
                byhour=range(9, 18),
                wkst=MO
            )
        ]
    )
print(
    worktime_count(
        parse('2022-05-13 17:50:00'),
        parse('2022-05-16 09:10:00')
    )
)
# 20
print(
    worktime_count(
        parse('2022-05-13 17:50:00'),
        parse('2022-05-13 18:00:00')
    )
)
# 10
</code>


Отправка фото по file_id из базы данных , вместо фото отправляет file_id текстом
Есть бот. Задача следующая: админ через машину состояний вносит данные в БД, в том числе фото. С загрузкой и последующей отправкой, при условии одного фото проблем не было. Но фото должно быть несколько. Как сохранить альбомом, решения я не нашёл. В голову пришла следующая идея.

@dp.message_handler(content_types=['photo','text'], state=FSMAdmin.photo)
async def FSMAdmin_photo(message: types.Message, state=FSMContext):
  if message.from_user.id == ID:
    global List_photo
    if message.content_type == 'photo':
        print(message)
        List_photo.append(message.photo[0].file_id)
        await bot.send_message(message.from_user.id, 'Загрузите следующее фото')
    elif message.content_type == 'text':
        async with state.proxy() as data:
            data['photo'] = ','.join(List_photo)
            print(data)
        await FSMAdmin.next()
        await bot.send_message(message.from_user.id, 'Введите описание')

А вот при извлечении данных по запросу пользователя столкнулся с проблемой. Запись, в которой одно фото отправляется пользователю, но file_id приходит обычным текстом. Если фото было несколько, то вообще выдаёт ошибку:

Task exception was never retrieved
future: <Task finished name='Task-63' coro=<Dispatcher._process_polling_updates() done,
defined at C:\Users\Дмитрий\Desktop\Samani_Bot\venv\lib\site-
packages\aiogram\dispatcher\dispatcher.py:407> exception=BadRequest('Wrong remote file
identifier specified: wrong string length')>
Traceback (most recent call last):
File "C:\Users\Дмитрий\Desktop\Samani_Bot\venv\lib\site-
packages\aiogram\dispatcher\dispatcher.py", line 415, in _process_polling_updates
for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
File "C:\Users\Дмитрий\Desktop\Samani_Bot\venv\lib\site-
packages\aiogram\dispatcher\dispatcher.py", line 235, in process_updates
return await asyncio.gather(*tasks)
File "C:\Users\Дмитрий\Desktop\Samani_Bot\venv\lib\site-
packages\aiogram\dispatcher\handler.py", line 116, in notify
response = await handler_obj.handler(*args, **partial_data)
File "C:\Users\Дмитрий\Desktop\Samani_Bot\venv\lib\site-
packages\aiogram\dispatcher\dispatcher.py", line 256, in process_update
return await self.message_handlers.notify(update.message)
File "C:\Users\Дмитрий\Desktop\Samani_Bot\venv\lib\site-
packages\aiogram\dispatcher\handler.py", line 116, in notify
response = await handler_obj.handler(*args, **partial_data)
File "C:\Users\Дмитрий\Desktop\Samani_Bot\Handler\client.py", line 75, in command_read
await sqlite_db.sql_read(message)
File "C:\Users\Дмитрий\Desktop\Samani_Bot\data_base\sqlite_db.py", line 23, in sql_read
await bot.send_photo(message.from_user.id, f'ОПИСАНИЕ:\n{i[1]}\nВНИМАНИЕ!!! Цена указана без
учёта скидок\n{i[2]}')
File "C:\Users\Дмитрий\Desktop\Samani_Bot\venv\lib\site-packages\aiogram\bot\bot.py", line
527, in send_photo
result = await self.request(api.Methods.SEND_PHOTO, payload, files)
File "C:\Users\Дмитрий\Desktop\Samani_Bot\venv\lib\site-packages\aiogram\bot\base.py", line
231, in request
return await api.make_request(await self.get_session(), self.server, self.__token, method,
data, files,
File "C:\Users\Дмитрий\Desktop\Samani_Bot\venv\lib\site-packages\aiogram\bot\api.py", line
140, in make_request
return check_result(method, response.content_type, response.status, await response.text())
File "C:\Users\Дмитрий\Desktop\Samani_Bot\venv\lib\site-packages\aiogram\bot\api.py", line
115, in check_result
exceptions.BadRequest.detect(description)
File "C:\Users\Дмитрий\Desktop\Samani_Bot\venv\lib\site-packages\aiogram\utils\exceptions.py",
line 141, in detect
raise cls(description)
aiogram.utils.exceptions.BadRequest: Wrong remote file identifier specified: wrong string
length

Вот сам хендлер и функция, которые выдают по запросу информацию из БД.

@dp.message_handler(commands='Просмотреть')
async def command_read(message: types.Message):
await sqlite_db.sql_read(message)

async def sql_read(message):
for i in cur.execute('SELECT*FROM kitchen').fetchall():
    for photo in i:
        print(type(photo))
        await bot.send_message(message.from_user.id, photo)
    await bot.send_photo(message.from_user.id, f'ОПИСАНИЕ:\n{i[1]}\nВНИМАНИЕ!!! Цена указана
без учёта скидок\n{i[2]}')

Во входящем сообщении, при загрузке фото, тип данных у file_id "str", на выходе тип данных такой же.
Опыта очень мало и сломал уже голову. Хотелось бы понять где и что сделано неверно.
Буду рад конструктивной критике и советам.

Вопрос закрыт. Для себя нашёл следующее решение.
Хендлер, получающий информацию на входе, оставляем без изменений:

async def FSMAdmin_photo(message: types.Message, state=FSMContext):
if message.from_user.id == ID:
    global List_photo
    if message.content_type == 'photo':
        List_photo.append(message.photo[0].file_id)
        await bot.send_message(message.from_user.id, 'Загрузите следующее фото')
    elif message.content_type == 'text':
        async with state.proxy() as data:
            data['photo'] = ','.join(List_photo)
            await FSMAdmin.next()
        await bot.send_message(message.from_user.id, 'Введите описание')

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

List_photo.clear()
await state.finish()

Ну и само решение:

async def sql_read(message):
for ret in cur.execute('SELECT*FROM kitchen').fetchall():
    group = types.MediaGroup()
    for photo in ret[0].split(','):
        group.attach_photo(photo)
    await bot.send_media_group(message.from_user.id, group)
    await bot.send_message(message.from_user.id,  f'ОПИСАНИЕ:\n{ret[1]}\nВНИМАНИЕ!!!
                           Цена указана без учёта скидок\n{ret[2]}')

Ответ нашёл вот здесь:
Aiogram - отправка файлов


Заменить значение словаря на максимальное значение
Всем доброго дня! Есть такая задача - написать программу, которая по данным протокола определяет победителя и призёров. Первая строка содержит число N — это общее количество строк протокола. Каждая из следующих N строк содержит записанные через пробел результат участника (целое неотрицательное число) и игровое имя.
То есть я решила сделать так - создать пустой словарь, если имени игрока в нем еще нет, то добавить его туда, а если оно там есть, то в случае если имеющиеся значение меньше введонного с клавиатуры - то заменить его.
Например есть словарь record = {qwerty: 1234}, вводим новую строку протокола, проверяем что qwerty уже есть, и видим что новый балл уже 3275. как заменить значение 1234 на 3275 у игрока qwerty ?
<code>
N = int(input('Сколько записей вносится в протокол? '))
record = dict()
for i in range(1, N+1):
    entry = input(f'{i} запись: ')
    score, player = entry.split()
    score = int(score)
    if player not in record:
        record[player] = score
    else:
        record[player] = max(score) - # вот это надо как-то правильно выразить

print(record)
</code>
пробовала еще написать функцию, где сравниваю значение списка и словаря и присваиваю словарю максимальное? но получилось громостко и не все равно не работает.

Можно, кстати, воспользоваться методом
get у словаря и тогда можно в одну строчку записать и без проверки, что такой ключ уже есть:

    record[player] = max(score, record.get(player, 0))


проблемы с командой приветствия дискорд.ру
<code>
async def on_member_join(member):
    chanel = bot.get_channel(a)
    await chanel.send(f'{member.name} присоиединился')
@bot.command()
async def setchanel(ctx,*,chanel):
    setchanel = chanel
    return setchanel```

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

Я не применял id канала..

@bot.event
async def on_member_join(member):
    global chanel
    await chanel.send(f'{member.name} присоединился')

@bot.command()
async def setchanel(ctx, channel: discord.TextChannel)
    global chanel
    chanel = channel

А здесь уже с применением id

@bot.event
async def on_member_join(member):
    global chanel
    await chanel.send(f'{member.name} присоединился')

@bot.command()
async def setchanel(ctx, channel_id)
    global chanel
    chanel = bot.get_channel(channel_id)


При запуске кода выдает следующее "The Zen of Python, by Tim Peters" [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

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

Закрыт 1 год назад.

                        Улучшить вопрос

При запуске кода у меня выходит эта надпись, не могу понять что делать
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than right now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
И не выдает ошибку, пока я не отключаю
Что здесь не так, помогите пожалуйста?

Я уверен, что в коде подключается библиотека
this ¯\_(ツ)_/¯


Парсинг платёжного поручения 1С
коллеги.
Мне нужно распарсить платёжное поручение, выгруженное из 1С, которое имеет следующий вид:

Документ=Платежное поручение
СекцияДокумент=Платежное поручение
Номер=1
Дата=16.05.2022
Сумма=888.88
ПлательщикСчет=03111111111111111111
Плательщик=ИНН 9777777777 ООО "Рога&Копыта"
ПлательщикИНН=9777777777
Плательщик1=ООО "Рога&Копыта"
ПлательщикРасчСчет=03111111111111111111
ПлательщикБанк1=УФК ПО Г. МОСКВЕ
ПлательщикБанк2=г. Москва
ПлательщикБИК=004444444
ПлательщикКорсчет=40101111111111111111
ПолучательСчет=40222222222222222222
Получатель=ИНН 000000000000 Иванов Иван Иванович
ПолучательИНН=000000000000
Получатель1=Иванов Иван Иванович
ПолучательРасчСчет=40222222222222222222
ПолучательБанк1=ПАО СБЕРБАНК
ПолучательБанк2=г. Москва
ПолучательБИК=044525225
ПолучательКорсчет=30101111111111111111
КодНазПлатежа=1
ВидОплаты=01
ПлательщикКПП=772222222
Очередность=3
КонецДокумента
СекцияДокумент=Платежное поручение
Номер=2
Дата=16.05.2022
Сумма=7777.77
ПлательщикСчет=03111111111111111111
Плательщик=ИНН 9777777777 ООО "Рога&Копыта"
ПлательщикИНН=9777777777
Плательщик1=ООО "Рога&Копыта"
ПлательщикРасчСчет=03111111111111111111
ПлательщикБанк1=УФК ПО Г. МОСКВЕ
ПлательщикБанк2=г. Москва
ПлательщикБИК=004444444
ПлательщикКорсчет=40101111111111111111
ПолучательСчет=40333333333333333333
Получатель=ИНН 000000000000 Петров Петр Петрович
ПолучательИНН=000000000000
Получатель1=Петров Петр Петрович
ПолучательРасчСчет=40333333333333333333
ПолучательБанк1=ПАО СБЕРБАНК
ПолучательБанк2=г. Москва
ПолучательБИК=044525225
ПолучательКорсчет=30102222222222222222
КодНазПлатежа=1
ВидОплаты=01
ПлательщикКПП=772222222
Очередность=3
КонецДокумента
КонецФайла

Реализовал парсинг так:

def collect_pay_info(file) -> list:
    result = []
    with open(file, 'r', encoding='Windows-1251') as f:
        tmp = f.readline().strip()
        while 'КонецФайла' not in tmp:
            data = {'docNum': '',
                    'docDate': datetime.now().strftime('%Y-%m-%d'),
                    'paySum': '',
                    'sumNds': '0.00',
                    'recip_Name': '',
                    'recip_CheckAcc': '',
                    'recip_BIK': '',
                    'recip_BankName': '',
                    'recip_CorrAcc': ''}
            while 'КонецДокумента' not in tmp:
                if 'ПолучательСчет=' in tmp:
                    data['recip_CheckAcc'] = tmp.strip().split('=')[1]
                if 'Получатель1=' in tmp:
                    data['recip_Name'] = tmp.strip().split('=')[1]
                if 'ПолучательРасчСчет=' in tmp:
                    data['recip_CheckAcc'] = tmp.strip().split('=')[1]
                if 'ПолучательБанк' in tmp:
                    data['recip_BankName'] = tmp.strip().split('=')[1]
                if 'ПолучательБИК=' in tmp:
                    data['recip_BIK'] = tmp.strip().split('=')[1]
                if 'ПолучательКорсчет=' in tmp:
                    data['recip_CorrAcc'] = tmp.strip().split('=')[1]
                if 'Сумма=' in tmp:
                    data['paySum'] = tmp.strip().split('=')[1]
                tmp = f.readline().strip()
            result.append(data)
            tmp = f.readline().strip()
    return result

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

Большое спасибо всем за помощь! Результат:

from datetime import datetime

def collect_pay_info(file):
    translators = {
        'Дата': 'docDate',
        'ПолучательСчет': 'recip_CheckAcc',
        'Получатель1': 'recip_Name',
        'ПолучательРасчСчет': 'recip_CheckAcc',
        'ПолучательБанк1': 'recip_BankName',
        'ПолучательБИК': 'recip_BIK',
        'ПолучательКорсчет': 'recip_CorrAcc',
        'Сумма': 'paySum',
    }

    formaters = {
        'Дата': datetime.now().strftime('%Y-%m-%d'),
    }

    docpack = []
    curdoc = {}

    text = open(file, 'r', encoding='Windows-1251').read()

    for line in text.splitlines()[1:]:
        if line.startswith('КонецДокумента'):
            docpack.append(curdoc)
            curdoc = {}
            continue
        if line.startswith('КонецФайла'):
            break
        key, value = line.split('=', maxsplit=1)
        value = formaters.get(key, value)
        key = translators.get(key, None)
        if key:
            curdoc[key] = value
    return docpack

Сделал REPO

text = open(file, 'r', encoding='Windows-1251').read()

Переводы ключей можно лучше положить в отдельный словарь чтоб не делать простыню из if, тоже самое с форматированием некоторых полей (если оно нужно):

translators = {
   "Номер":"Number"
}

import datetime
import decimal

formaters = {
   "Дата": lambda value: datetime.datetime.strptime(value,"%d.%m.%Y").date(),
   "Сумма": lambda value: decimal.Decimal(value)
}

Чтоб не вкладывать циклы друг в друга, беру переменную скидываю её в результат по метке конца документа

docpack = [  ]
curdoc = {}

for l in text.splitlines():
    print(repr(l))
    if l.startswith("КонецДокумента"):
       docpack.append(curdoc)
       curdoc = {}
       continue
    if l.startswith("КонецФайла"):
       break
    key, value = l.split("=", maxsplit=1)
    value = formaters.get(key, str)(value)
    key = translators.get(key, key)
    curdoc[key] = value

import pprint
pprint.pprint(docpack)

Если ненужные ключи нужно исключить, то:

    key = translators.get(key, None)
    if key: curdoc[key] = value


Два графика boxplot внутри одного
Как отобразить два графика boxplot на одном графике.  Имеются два одинаковых по названию столбца, но в разных датасетах. Они в одном масштабе и с одинаковыми единицами измерения.
<code>
a=df_train['rougher.input.feed_size']
b=df_test['rougher.input.feed_size']
</code>
Необходимо сравнить их. Как построить два боксплота в seaborn, чтобы наглядно посмотреть разницу.

Вот пример на английском СО с использованием
plt.subplots:

f, axes = plt.subplots(1, 2) # можно ещё добавить параметр sharey=True

sns.boxplot(  y="b", x= "a", data=df,  orient='v' , ax=axes[0])
sns.boxplot(  y="c", x= "a", data=df,  orient='v' , ax=axes[1])

Вам немного нужно будет приспособить под себя, но, думаю, идея понятна.
Update: Конкретно для вашего случая попробуйте так:

sns.boxplot(y="rougher.input.feed_size", data=df_train, orient='v', ax=axes[0])
sns.boxplot(y="rougher.input.feed_size", data=df_test, orient='v', ax=axes[1])


Я пытаюсь написать код для подсчета разницы входа и выхода, в минутах
Я пытался написать код для подсчета разницы входа и выхода, если рабочие часы с 9:00 по 18:00 и не забывая, что сб-вс выходные дни.
У меня подсчитывается все время, а должно так "вход: 16-05-2022 12:00:00 и выход: 17-05-2022 11:23:00"
Помогите пожалуйста как это можно реализовать?
Мой код:
<code>
def find_minutes(start, end):
    temp = end - start
    days = temp.days
    for i in range(1 ,days+1):
        now = start + datetime.timedelta(i)
        if now.strftime("%A") in ["Saturday", 'Sunday']:
            temp -= datetime.timedelta(1)
    return temp

start = datetime.datetime.strptime(input(), "%m-%d-%Y %H:%M:%S")
end = datetime.datetime.strptime(input(), "%m-%d-%Y %H:%M:%S")

print(F"{int(find_minutes(start, end).total_seconds()//60)} minutes")
</code>

вы проверяете день недели, но не проверяете время. Добавьте в цикл проверку времени, например как-то так:

from datetime import datetime as dt, timedelta as td, time

start = dt.fromisoformat('2022-05-17 17:55:00')
end = dt.fromisoformat('2022-05-17 20:00:00')
time_start = time.fromisoformat('09:00')
time_end = time.fromisoformat('18:00')

res = 0
t = start
while (t:=t+td(minutes=1))<=end:
    if t.weekday()<5 and time_start<=t.time()<=time_end:
        res+=1
print(res)  # 5

или с помощью pandas примерно так:

import pandas as pd

dates = pd.date_range('2022-05-17 17:55:00', '2022-05-17 20:00:00', freq='T')
res = len(dates[(dates.time>=time_start)&(dates.time<time_end)&(dates.weekday<5)])

print(res)  # 5


Как заставить питон создать ярлык на рабочий стол?
Ребят есть код, который кидает файл в папку документы, хочу сделать кнопку которая создаст ярлык на рабочий стол
<code>
from tkinter import *
tk= Tk()
tk.title("программа")
tk.geometry("1280x900")
bl = Button(tk. text = создать ярлык, command = s1)
bl = Button(tk. text = переместить, command = s2)
def s2():
import shutil
 shutil.copyfile('DLL_files\\usb\\PCTEST\\OCCT.exe','C:\\Users\\Public\\Documents\\OCCT.exe')

def s1():
     import os
     os.symlink("C:\\Users\\Public\\Documents\\OCCT.exe", "a\\occt.lnk")
</code>
Код ошибки OSError: [WinError 1314] Клиент не обладает требуемыми правами: 'C:\Users\Public\Documents\OCCT.exe' -> 'a\occt.lnk'
или
Не достаточно прав.

Для symlink нужны права администратора, лучше попробуй это:
<code>
import os
import winshell
from win32com.client import Dispatch

def create_shortcut(file_name: str, target: str, work_dir: str,
                    arguments: str = ''):
    shell = Dispatch('WScript.Shell')
    shortcut = shell.CreateShortCut(file_name)
    shortcut.TargetPath = target
    shortcut.Arguments = arguments
    shortcut.WorkingDirectory = work_dir
    shortcut.save()

desktop = winshell.desktop()
path = os.path.join(desktop, "Название ярлыка.lnk")
target = r"Путь к папке файла запуска программы"
wDir = r"Путь к папке программы"
icon = r"Путь к иконке для ярлыка"

shell = Dispatch('WScript.Shell')
shortcut = shell.CreateShortCut(path)
shortcut.Targetpath = target
shortcut.WorkingDirectory = wDir
shortcut.IconLocation = icon
shortcut.save()
</code>


Как посчитать максимальное произведение цифр в каждой строке матрицы?
Мне нужно посчитать произведения цифр элементов матрицы каждой строки и вывести наибольшее произведение в дополнительном столбце справа от матрицы. При подсчёте произведения получаются странные значения, как пофиксить?
P.s. имеется ввиду нужно брать каждый элемент в строке матрицы, считать произведение его цифр, а затем сравнить с произведениями полученными из других элементов матрицы этой же строки, находить большее и выводить в столб справа от матрицы. Далее цикл переходит к следующей строке.
Вот код:
<code>
from tkinter import *
import random

root = Tk()
root.title('main')
root.geometry('800x600')

c = Canvas(width=800, height=600, bg='white')
c.place(x=0, y=0)

stolbi = 0

def getting1():
    global stolbi
    stolbi = 6
    print(stolbi)

def getting2():
    global stolbi
    stolbi = 7
    print(stolbi)

def getting3():
    global stolbi
    stolbi = 8
    print(stolbi)

def getting4():
    global stolbi
    stolbi = 9
    print(stolbi)

def CurSelect(event):
    global valuestrok
    valuestrok=int(stroki_listbox.get(stroki_listbox.curselection()))
    print(valuestrok)

#Создание ListBox
stroki = [6,7,8,9]
stroki_listbox = Listbox(width = 10, height = 4, font = 'TimesNewRoman 14', highlightcolor = 'blue')
for number in stroki:
    stroki_listbox.insert(END, number)

stroki_listbox.bind('<<ListboxSelect>>', CurSelect)
stroki_listbox.place(x=500,y=150)

#Создание радиокнопок
r_var = BooleanVar()
r_var.set(0)
r1 = Radiobutton(text='6', indicatoron = 0, variable=r_var, value=1, width = 15, command = getting1)
r1.place(x=500,y=300)

r2 = Radiobutton(text='7', indicatoron = 0, variable=r_var, value=2, width = 15, command = getting2)
r2.place(x=500,y=325)

r3 = Radiobutton(text='8', indicatoron = 0, variable=r_var, value=3, width = 15, command = getting3)
r3.place(x=500,y=350)

r4 = Radiobutton(text='9', indicatoron = 0, variable=r_var, value=4, width = 15, command = getting4)
r4.place(x=500,y=375)

t1 = c.create_text(585, 100, text = 'Выберите кол-во строк:', font = 'TimesNewRoman 12')
t2 = c.create_text(600, 270, text = 'Выберите кол-во столбцов:', font = 'TimesNewRoman 12')

m = []
list1 = []
def start(event):

    global y_coords, x_coords, m, list1

    #Матрица

    y_coords = 0
    m = [] # объявление массива, сначала как одномерного
    c.delete('all')
    t1 = c.create_text(585, 100, text = 'Выберите кол-во строк:', font = 'TimesNewRoman 12')
    t2 = c.create_text(600, 270, text = 'Выберите кол-во столбцов:', font = 'TimesNewRoman 12')
    for i in range(valuestrok): #цикл по строкам
        m.append([]) # добавление второй размерности массива
        y_coords += 50 # смещение очередной строки матрицы вниз по вертикали
        x_coords  = 0 # начальные значения координат Х элементов матрицы на канве
        for j in range(stolbi): # цикл по столбцам матрицы
            ct = random.randint(-100, 100) # генерация целого случайного числа в диапазоне -100 до 100
            m[i].append(ct) # добавление сгенерированного числа в матрицу
            x_coords += 40 # смещение очередного элемента матрицы вправо по горизонтали
            c.create_text(x_coords, y_coords, text = ct) # вывод на канву очередного элемента матрицы

    #Наибольшее произведение цифр в элементах каждой строки
    y_coords = 0
    mult = 1
    i = 0  # Номер столбца
    list1 = []

    while i != valuestrok:
        y_coords += 50
        for j in range(stolbi):
            a = int(m[i][j])
            for k in str(abs(a)):
                while int(k) > 0:
                    digit = int(k) % 10
                    mult = mult * digit
                    k = int(k) // 10

        list1.append(mult)
        print(mult)
        c.create_text(400, y_coords, text=mult, font='Times 11')
        mult = 1
        i = i + 1

c.bind("<Button-2>", start) #запуск программы на колесо мыши
root.mainloop()
</code>

для примера который вы указали в комментариях, сработает такой код
Про reduce

from functools import reduce

lst = [[12,13,14],[24,25,26],[34,35,36]]

for x in lst:
  mx = float("-inf")
  for n in x:
    mx = max(mx, int(reduce(lambda x,y: int(x) * int(y), str(n))))
  x.append(mx)

print(lst)
# [[12, 13, 14, 4], [24, 25, 26, 12], [34, 35, 36, 18]]

UPD: для отрицательных чисел доработка во втором цикле

  for n in x:
    n = list(str(n))
    if "-" in n:
      n[0] = n[0]+n.pop()
    mx = max(mx, int(reduce(lambda x,y: int(x) * int(y), n)))
  x.append(mx)


Как правильно решить упражнение из книги Эрика Мэтиза "Изучаем Python 3е издание", главе по сортировке, задача 3.8:
Задание заключается в том, чтобы используя функцию sorted() вывести список в обратном алфавитном порядке без изменения порядка исходного списка.

from audioop import reverse
from itertools import count

pets = ['gekko', 'bird', 'cat', 'dog', 'rat']
print(pets)

print(sorted(pets))

print(pets)

z = sorted(pets)
print(z.reverse())

print(pets(reverse=True))

Как ни переставляй
reverse=True, вывод выдает такую ошибку:

TypeError: 'list' object is not callable

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

Вообще можно вывести список в обратном порядке при помощи срезов, конкретно —
[::-1]. К тому же
reverse = True не может использоваться для списков, это используется для
sorted().

pets = ['gekko', 'bird', 'cat', 'dog', 'rat']

print(sorted(pets, reverse=True))

z = sorted(pets)
print(z[::-1])


Как передать в функцию несколько параметров через пробел?
Хочу сделать такую функцию:
<code>
def f(???):
   print(???)
f(1 2 3 4 5)
</code>
Мне нужно сделать как-то это не через запятые, а именно через пробел. Помогите

Если вам ввод от user нужен, то решите проблему на уровне ввода.
Например,
<code>
    # Ввод строки, разделение её по пробелу и распаковка её в отдельные параметры
    a, b = input().split()
    # Вызов функции с, если надо, например, преобразованием строковых значений в целые
    f (int(a), int (b))
</code>


Telebot нет цикла
Доброго дня всем.
Изучаю создание ТГ ботов на Python.
Прошу строго не ругать и подсказать решение.
Код ниже:
<code>
import telebot

token = "здесь токен"

bot = telebot.TeleBot(token)

@bot.message_handler(commands = ['start','help'])
def send_welcome(message):
    bot.reply_to(message, 'Hi')

bot.polling(none_stop=True)
</code>
на мой взгляд бот не зацикливается т.к. в терминале PyCharm выдаёт "Process finished with exit code 0"
Пробовал изменять bot.polling. Пробовал использовать прокси. Бот в ТГ не отвечает.
pyTelegramBotAPI   4.5.1
Заранее благодарю за советы.


TypeError: () takes no arguments Вылетает ошибка
<code>
import random

class Human:

    def __int__(self, name, satiety=50, food=50, money=0):
        self.name = name
        self.satiety = satiety
        self.food = food
        self.money = money

    def day(self, action):
        if self.satiety < 20 and self.food >= 10:
            self.satiety += 10
            self.food -= 10
            print(f'{self.name} поел.')
        elif self.food < 1 and self.money > 0:
            self.food += 20
            self.money -= 10
            print(f'{self.name} сходил в магазин.')
        elif action == 1:
            self.money += 50
            print(f'{self.name} работает.')
        elif action == 2:
            self.satiety += 10
            self.food -= 10
            print(f'{self.name} трапезничает.')
        else:
            self.satiety -= 10
            print(f'{self.name} играет.')

class Result:
    def __init__(self, man_1, man_2):
        self.man_1 = man_1
        self.man_2 = man_2

    def life_death(self):
        if self.man_1.satiety == 0 or self.man_2.satiety == 0:
            return True, print('Один из участников умер')

human_1 = Human('Степан')
human_2 = Human('Артур')

result = Result(human_1, human_2)
count_day = 0

while True:
    count_day += 1
    if count_day == 365:
        print('\nЭксперимент удался, все живы.')
        break
    elif result.life_death():
        break
    else:
        r = random.randint(1, 6)
        human_1.day(r)
        human_2.day(r)

print(count_day)
</code>
Подскажите пожалуйста. Уже все пересмотрел но на 43 и 44 строке вылетает TypeError: Human() takes no arguments Ума не приложу в чем может быть причина.

Вы просто вместо
__init__ написали
__int__, из-за чего интерпретатор решил, что у бедного класса нет конструктора. Если поменять эти строки, то программа должна будет заработать.

def __init__(self, name, satiety=50, food=50, money=0): # было — __int__
        self.name = name
        self.satiety = satiety
        self.food = food
        self.money = money


Зависимость быстродействия кода от используемых средств Python
Ясно, что быстродействие зависит от правильно выбранного алгоритма.
Но также очевидно, что быстродействие должно зависеть и от выбранных средств языка (что в случае интерпретируемого Python приобретает особую важность), а неудачный выбор снизит его даже при правильно выбранном алгоритме.
Вопрос: есть ли способ (кроме имитации) для определения того, какие средства Python быстрее, а какие медленнее? Например, какие библиотеки написаны на С ("быстрые"), а какие - на Python ("не-такие-быстрые")? Или (условно) одинаковая ли скорость поиска или сортировки в разных типах? И т.д.
Это могут быть как какие-то встроенные средства, так и одна чудо-страница в документации.
Цель: практическая - писать быстро работающие программы. Теоретические сравнения экзотических комбинаций не прошу.

Суммирую в ответе основное, что мне посоветовали в комментариях к вопросу:

"для больших числовых массивов обычно лучше использовать Numpy, он написан на C++ и оптимизирован для работы с такими данными. Так то вообще большинство библиотек для питона пишется на C++ либо современной версии Fortran и затачивается под максимальное быстродействие. А вот встроенные типы питона сделаны максимально гибкими и поэтому они обычно довольно медленные в сравнении со специальными библиотеками."

Начать стоит с PythonSpeed PerformanceTips


Временное отключение Unique constraint
Имеется модель задачи:

class Task(models.Model):
    index = models.PositiveSmallIntegerField('Нумерация')
    chapter = models.ForeignKey(..., verbose_name='Раздел')
    ...

    class Meta:
        unique_together = ('chapter', 'index')
        verbose_name_plural = 'Задачи'
        verbose_name = 'Задача'

Каждая задача привязана к разделу. Задачи имеют уникальную порядковую нумерацию в рамках раздела.
Мне необходимо реализовать функцию изменения порядка задач, в UI это выглядит как перетаскивание задач путем нажатия на стрелочки вверх/вниз. На сервер приходит json вида:

{
  *task_id1*: *order_delta1*,
  *task_id2*: *order_delta2*,
}

task_id - id задачи

order_delta - дельта, на которую поменялась нумерация задачи
И дальше я написал вот такую функцию:

def save_order_changes(changes: list[ChangeEntry]):
    changed_ids = (change.task_id for change in changes)
    # Создаем условия
    statements = (
        When(pk=change.task_id, then=F('index') + change.delta)
        for change in changes
    )
    # Создаем условия
    Task.objects.filter(pk__in=changed_ids).update(
        index=Case(*statements)
    )

Но из-за
unique_together я получаю ошибку:

django.db.utils.IntegrityError: UNIQUE constraint failed: tasks_task.chapter_id, tasks_task.index

Мне казалось, что в рамках одного запроса проверка падать не должна, ведь значения в конечном виде должны фиксироваться с соблюдением уникальности?
Есть ли варианты обхода? Можно ли временно отключить для одного запроса проверку на уникальность?

Некоторые СУБД поддерживают отложенную проверку ограничений. Это конфигурируется так:
<code>
from django.db.models import Deferrable, UniqueConstraint

class Task(..):

  class Meta:
    contraints = [
        UniqueConstraint(
            name='unique_chapter_index',
            fields=['chapter', 'index'],
            deferrable=Deferrable.DEFERRED,
        )
    ]
</code>
Проверка в таком случае делается в конце транзакции. Если используется автокоммит, то в конце операции update.


Отображение многостроковых r-строк
В интерактивном интерпретаторе я завожу многострочную строку и пытаюсь ее вывести.
<code>
>>> s = r'''Hello my
... friend'''
>>> s
... 'Hello my\nfriend'
>>> print(s)
Hello my
friend
</code>
Так как это r-строка, интерактивный интерпретатор преобразует перенос строки в символ '\n' и выводит текст в одну строку. Здесь вопросов нет. Все логично.
Однако в случае с вызовом функции print(), мы видим что текст разбился на 2 строки.
Подскажите, в чем причина такого поведения функции print()?

В дополнение к уже данным ответам.
Поиграйтесь с методами строк. Пример

>>> s.__repr__()
"'Hello my\\nfriend'"
>>> repr(s)
"'Hello my\\nfriend'"
>>> s.__str__()
'Hello my\nfriend'

Можно прочитать про метод repr.
Переведу различие между
str и
repr из документации

Функция
str предназначена для возврата представлений, которые удобочитаемы для человека, в то время как
repr предназначена для генерирования представлений, которые может прочитать интерпретатор. (или вызовет SyntaxError, если нет эквивалентного синтаксиса). Для объектов, которые не имеют конкретного представления удобного для  человека, str() вернет то же значение, что и repr().


Скрыть вывод команды ping
Есть фрагмент кода:

import os
address = 'google.com'
response = os.system('ping -c 1 ' + address)

Проблема в том, что бесполезная в моём случае информация, выводимая командой
ping, не должна выводиться в консоль.

если требуется получать только код завершения ping, то можно перенаправить вывод в '> nul'
<code>
os.system(f'ping {address} > nul')
</code>


Прошу подсказать как сделать обработку ошибок в aiogram
Я пишу телеграм бота на python aiogram. Подскажите пожалуйста как можно сделать обработчик ошибок? К примеру пользователь спамит командой, у него появлется сообщение от бота
"Вы не можете использовать данную команду, вам нужно подождать столько то секунд".
Или если
бот не может написать пользователю, так как пользователь не писал боту или
бот заблокирован у пользователя. Ну и другие распространённые ошибки. Как их можно улавливать?
Желательно одним handler'ом.

Это перед командой
<code>
@dp.throttled(antiflood, rate=3)
async def antiflood(*args):
    m = args[0]
    await m.answer(msg.antiflood)
</code>


Переопределение встроенного print
Подскажите, реально переопределить встроенный print таким образом, чтобы он принимал произвольный ключевой аргумент?

print("test.", color=Fore.GREEN)

Хочу таким образом реализовать вывод цветного текста в терминал и параллельное логирование всего, но уже без ANSI escape characters.

class Logger(object):
        def __init__(self):
            self.terminal = sys.stdout
            now = datetime.today().strftime('%m_%d_%Y-%I_%M_%S_%p')
            self.log = open("log_for_" + now + ".log", "a", encoding="utf-8")

        def write(self, message, color=""):
            self.terminal.write(color + message)
            self.log.write(message)

        def flush(self):
            pass

Либо как решить подобную задачу хорошо?

Вы конечно можете переопределить функцию
print, но я бы советовал подумать о другом подходе, это достаточно плохая практика.
Если все таки решите переопределять, то пример ниже, функцию объявляем вне класса

from builtins import print as base_print

def print(*args, **kwargs):
  if kwargs.get("color"):
    # Ваша логика
    # ...
    # Следующие три строки это пример логики:
    color = kwargs.pop("color") # не забываем удалить значение из kwargs
    base_print(color, sep="")
    base_print(*args, **kwargs)
  else:
    base_print(*args, **kwargs)

print("hello", [1,2,3,4], color="green")

вывод:
green
hello [1,2,3,4]

print("hello", [1,2,3,4])

вывод:
hello [1,2,3,4]

UPD: как заметил коментатор @Danis, если требуется оставить стандартный вывод при любой ситуацию, то можно упростить код

from builtins import print as base_print

def print(*args, **kwargs):
  if kwargs.get("color"):
    # Ваша логика
    # ...
    # Следующие три строки это пример логики:
    color = kwargs.pop("color") # не забываем удалить значение из kwargs
    base_print(color, sep="")
  base_print(*args, **kwargs)


Как сделать перенос строки после : Text Tkinter
Помогите сделать чтобы в виджите Text после символа : и после нажатия на Enter производился перенос строки с 4-мя пробелами.

Да, задачка интересная:

Ловим событие
'<Return>'.
Смотрим какой был предыдущий символ.
Если ":", то вставляем пробелы в следующую строку.
Отменяем перевод строки от клавиши "enter".

from tkinter import *

def insert_spaces(event):
    end_character = text.get('end-2c', 'end-1c')   # получаем предыдущий символ.
    if end_character == ':':
        text.insert('end', '\n    ')   # добавляем пробелы на следующей строке
        return 'break'   # отменяем перевод строки от клавиши Enter
root = Tk()

text = Text(width=100, height=25)
text.pack()
text.focus_set()
text.bind('<Return>', insert_spaces)
root.mainloop()

Не хотел вывешивать готовое решение, но может кому-то пригодиться.


Возможные примеры решения с нахождением функции min
Имеется поток данных о ценах товаров (считайте, что цена всегда больше 0). Необходимо написать алгоритм определения минимального четного числа в этом потоке.

sys_stdin = [78, 68, 484, 3, 254, 90, 143, 78, 43, 42, 3053, 473, 5, 8593, 16, 3, 1454, 37, 96, 8547]

x = min([pirce for pirce in sys_stdin if pirce % 2 == 0])
print(x)

Подскажите какими ещё способами можно решить эту задачу?
Пробую решить данным способом

sys_stdin = [78, 68, 484, 3, 254, 90, 143, 78, 43, 42, 3053, 473, 5, 8593, 16, 3, 1454, 37,
96, 8547]
num = [0]
for min_num in  sys_stdin:
    if min_num % 2 == 0:
    print(min_num)
    select = min(min_num)
print(select)

, но выдаёт ошибку

select = min(min_num)
TypeError: 'int' object is not iterable

Можете вот так:

sys_stdin = [78, 68, 484, 3, 254, 90, 143, 78, 43, 42, 3053, 473, 5, 8593, 16, 3, 1454, 37,
             96, 8547]
answ = float('inf')
for min_num in sys_stdin:
    if min_num % 2 == 0 and min_num < answ:
        answ = min_num
print(answ)

Или вот так:

answ_1 = min(map(lambda x: x if x % 2 == 0 else float('inf'), sys_stdin))
print(answ_1)

Вывод в обоих случаях:

16


После проверки подписки на канал программа не работает
<code>
@bot.message_handler(content_types = ['text'])
def check(message):
  if message.chat.type == 'private':
    if message.text == 'Подтвердить':
      status = ['creator', 'administrator', 'member']
      for stat in status:
        markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
        menu_btn = types.KeyboardButton('Главное меню')
        markup.add(menu_btn)
        if stat == bot.get_chat_member(chat_id = '-1001670595457', user_id = message.from_user.id).status:
          bot.send_message(message.chat.id, 'Вы подписаны на канал!', reply_markup = markup)
          break
        else:
          bot.send_message(message.chat.id, 'Доступ закрыт, подпишитесь на канал'
                                        f'{channel_link}')

@bot.message_handler(content_types = ['text'])
def func(message):
  if message.text == 'Главное меню':
    markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
    ref_btn = types.KeyboardButton('Реферальная ссылка')
    ref_count_btn = types.KeyboardButton('Ваши рефералы')
    buy_btn = types.KeyboardButton('Купить')
    markup.add(ref_btn, ref_count_btn, buy_btn)
    bot.send_message(message.chat.id, 'Меню', reply_markup = markup)

@bot.message_handler(content_types = ['text'])
def new_func(message):
  if message.text == 'Реферальная ссылка':
    bot_name = bot.get_me().username
    bot.reply_to(message, text=ref_link.format(bot_name, message.chat.id))
</code>
вот код, не знаю в чем проблема

Эхх... Ну она и не должна работать. У вас три хендлера. У всех трех хендлеров один и тот же фильтр, а как мы знаем, при получении сообщения/колбека от юзера, бот тригерит первый хендлер который подходит по условиям/фильтру.
В этом случае ваш бот видит первый(верхний) хендлер который способен реагировать на текст "Подтвердить" и всё. Нижние хендлеры же он игнорирует так как первый хендлер имеет условие
content_types = ['text'] то бишь он говорит "я принимаю в себя только текст!" и так как ваши остальные хендлеры делают в целом то же самое, то и возникает эта ситуация.
Короче к главному, "Как фиксить?"
Примерно вот так.

@bot.message_handler(content_types = ['text'])
def check(message):
  if message.chat.type == 'private':
    if message.text == 'Подтвердить':
      status = ['creator', 'administrator', 'member']
      for stat in status:
        markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
        menu_btn = types.KeyboardButton('Главное меню')
        markup.add(menu_btn)
        if stat == bot.get_chat_member(chat_id = '-1001670595457', user_id = message.from_user.id).status:
          bot.send_message(message.chat.id, 'Вы подписаны на канал!', reply_markup = markup)
          break
        else:
          bot.send_message(message.chat.id, 'Доступ закрыт, подпишитесь на канал'
                                        f'{channel_link}')
    if message.text == 'Главное меню':
      markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
      ref_btn = types.KeyboardButton('Реферальная ссылка')
      ref_count_btn = types.KeyboardButton('Ваши рефералы')
      buy_btn = types.KeyboardButton('Купить')
      markup.add(ref_btn, ref_count_btn, buy_btn)
      bot.send_message(message.chat.id, 'Меню', reply_markup = markup)
    if message.text == 'Реферальная ссылка':
      bot_name = bot.get_me().username
      bot.reply_to(message, text=ref_link.format(bot_name, message.chat.id))

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

@bot.message_handler(lambda msg: msg.chat.type == "private", lambda msg: msg.text == "Подтвердить")
def check(msg):
    status = ['creator', 'administrator', 'member']
    for stat in status:
        markup = types.ReplyKeyboardMarkup(resize_keyboard = True)
        menu_btn = types.KeyboardButton('Главное меню')
        markup.add(menu_btn)
        if stat == bot.get_chat_member(chat_id = '-1001670595457', user_id = message.from_user.id).status:
            bot.send_message(message.chat.id, 'Вы подписаны на канал!', reply_markup = markup)
            break
        else:
            bot.send_message(message.chat.id, 'Доступ закрыт, подпишитесь на канал'
                                        f'{channel_link}')

Но если говорить откровенно, я не помню можно ли юзать два лямбда фильтра одновременно. А так думаю суть понятна. Удачи


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

testlist = [
          {'score': 67.567, 'track': '03 Greedo & Kenny Beats - Dead Presidents'},
          {'score': 69, 'track': '03 Greedo & Kenny Beats - Dead Presidents'},
          {'score': 15, 'track': '03 Greedo - Dead Presidents'},
          {'score': 120, 'track': '03 Greedo - Dead Presidents'}
          ]
testlist = sorted(testlist, key=lambda x: x['score'], reverse=True)

Новый список должен иметь следующий вид:

newlist = [
          {'score': 120, 'track': '03 Greedo - Dead Presidents'},
          {'score': 69, 'track': '03 Greedo & Kenny Beats - Dead Presidents'}
          ]

Есть идеи решения подобной задачи? Буду рад любой помощи.

Можете попробовать так:

testlist = [
    {'score': 67.567, 'track': '03 Greedo & Kenny Beats - Dead Presidents'},
    {'score': 69, 'track': '03 Greedo & Kenny Beats - Dead Presidents'},
    {'score': 15, 'track': '03 Greedo - Dead Presidents'},
    {'score': 120, 'track': '03 Greedo - Dead Presidents'}
]

def my_key(d: dict):
    return d['track'], d['score']

new_list = sorted(testlist, key=my_key, reverse=True)
answ_list = []
temp = ''
for my_dict in new_list:
    if temp != my_dict['track']:
        answ_list.append(my_dict)
    temp = my_dict['track']
print(answ_list)

Вывод

[{'score': 120, 'track': '03 Greedo - Dead Presidents'}, {'score': 69, 'track': '03 Greedo & Kenny Beats - Dead Presidents'}]


Левое расположение вкладок QTabWidget в PyQt6
Подскажите пожалуйста, как работать с
QTabWidget в
PyQt6?
Проблема возникла при попытке сделать расположение вкладок слева.
Пример кода, работающий в PyQt5 без ошибок, а в PyQt6 выдает ошибку:

AttributeError: type object 'QTabWidget' has no attribute 'West'

from PyQt6.QtWidgets import QTabWidget, QApplication, QWidget, QHBoxLayout
import sys

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        main = QWidget(self)
        main.resize(200, 200)
        box = QHBoxLayout()
        main.setLayout(box)

        tabWidgetObjects = QTabWidget(self)
        #tabWidgetObjects.setTabPosition(QTabWidget.West)
        tabObjects_1 = QWidget()
        tabObjects_1.setObjectName("tabObjects_1")
        tabObjects_2 = QWidget()
        tabObjects_2.setObjectName("tabObjects_2")

        tabWidgetObjects.addTab(tabObjects_1, "вкладка 1")
        tabWidgetObjects.addTab(tabObjects_2, "вкладка 2")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec()

PyQt6 для всех флагов перечисления требуется явное имя перечисления.
Измените на

tabWidgetObjects.setTabPosition(QTabWidget.TabPosition.West)

tabPosition : TabPosition
Это свойство содержит положение вкладок в этом виджете вкладок.
Возможные значения этого свойства описываются перечислением
TabPosition.
По умолчанию для этого свойства установлено значение North.


Django в чем ошибка?
Столкнулся с ошибкой, что при введении в поле поиска слова и при нажатии на найти вылетает ошибка "UnboundLocalError: local variable 'page_object' referenced before assignment". Что делать?

{% extends 'food/base_main.html' %} {% load static %} {% block title%}Рецепты{% endblock title%} {% block nav %} {% if request.user.is_authenticated %}

<a href="{% url 'main' %}">
  <li><button class="nav_btn">Рецепты</button></li>
</a>
<li><button class="nav_btn">Избранное</button></li>
<a href="{% url 'create' %}">
  <li><button class="nav_btn_">Создать</button></li>
</a>
<a href="{% url 'profile' %}">
  <li class="enter"><button class='enter_btn'>{{user.first_name}}</button></li>
</a>
<a href="{% url 'logout' %}">
  <li class="reg"><button class='reg_btn'>Выход</button></li>
</a>
{% else %}

<a href="{% url 'main' %}">
  <li><button class="nav_btn">Рецепты</button></li>
</a>
<li><button class="nav_btn">Избранное</button></li>
<a href="{% url 'create' %}">
  <li><button class="nav_btn_">Создать</button></li>
</a>
<a href="{% url 'authentication' %}">
  <li class="enter"><button class='enter_btn'>Вход</button></li>
</a>
<a href="{% url 'registration' %}">
  <li class="reg"><button class='reg_btn'>Регистрация</button></li>
</a>
{% endif %} {% endblock %} {% block recept %}Рецепты{% endblock %} {% block liked %}Избранные{% endblock %} {% block crate %}Cоздать{% endblock %} {% block search_form_ %}
<form class="search_form" action="{% url 'main' %}">
  <input class="search_form_input" placeholder="Найти рецепт" type="search" name="search" arial-label="Найти рецепт">
  <button class="search_btn" type="submit">Найти</button>
</form>

{% endblock %} {% block content %} {% for card in page_object %}
<a class="recept_anim">
  <div class="recept">
    <div class="img_recept"><img class="main_img" src="images/images//{{ card.image }}">
      <div class='info'>
        <h4 class="product-name">{{ card.recipe_title }}</h4>
        <span class="time_text"><img src = "{% static 'images_defolt/timer_01101101.png' %}" class = "time_img">{{ card.recipe_time }} мин.</span><br>
        <span class="ingridients"><img src = "{% static 'images_defolt/food_for_card.png' %}"  class = "recept_img">{{ card.recipe_ingridients  }} ингридиента</span>
        <a href="{% url 'product_page'  card.id %}">
          <div class="card_btns">
            <button class="go_to_btn">Смотреть</button>
          </div>
        </a>
        <span class="author"><img src = "{% static 'images_defolt/person_logo.png' %}" class = "person_img">{{ card.user.first_name }}  {{card.user.last_name}}</span>
      </div>
    </div>

  </div>
  {% endfor %} {% endblock %} {% block pagintion_page_to_jinja %} {% for p in page_object.paginator.page_range %} {% if page_object.number == p %}
  <li class="pagination">
    <span href="?page={{ p }}" class="selected_btn_pagination">{{ p }}</span>
  </li>
  {% elif p >= page_object.number|add:-2 and p
  <=p age_object.number|add:2 %} <li class="pagination">
    <a href="?page={{ p }}" class="pages_href">{{ p }}</a>
    </li>
    {% endif %} {% endfor %} {% endblock %}

from django.shortcuts import render, redirect
from .forms import FoodForm, RegistrationForm,LoginUserForm
from .models import Recipe
from django.contrib.auth import logout
from django.contrib.auth.views import LoginView, reverse_lazy
from django.http import Http404
from django.core.paginator import Paginator

def index(request):

    search_query = request.GET.get("search", "")
    if search_query:
        card_info = Recipe.objects.filter(recipe_title__icontains=search_query)
        paginator = Paginator(card_info, 20)

    else:
        card_info = Recipe.objects.all()
        paginator = Paginator(card_info, 20)
        page_number = request.GET.get("page")
        page_object = paginator.get_page(page_number)

    return render(request, "food/main_jinja.html", {
        "cards": card_info,
        "page_object": page_object
        })

def product_page(request, object_id):
    try:
        product = Recipe.objects.get(id=object_id)

    except:
        raise Http404("Рецепт не найден!")

    return render(request, "food/product_page_jinja.html", {"object": product})

def create(request):
    if request.method == "POST":
        form = FoodForm(request.POST, request.FILES)
        if form.is_valid():
            recipe = form.save(commit=False)
            recipe.user = request.user
            recipe.save()
            return render(request, 'food/true.html')
        else:
            return render(request, 'food/test.html')
    form = FoodForm()
    context = {
        "form": form
    }
    return render(request, "food/crate.html", context)

def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return render(request, 'food/succses_reg.html')
        else:
            return render(request, 'food/false_registration_jinja.html', {"form" : form})
    form = RegistrationForm()
    context = {
        'form': form
    }
    return render(request, 'food/registration_main.html', context)

class LoginUser(LoginView):
    form_class = LoginUserForm
    template_name = "food/auth_page.html"

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        return dict(list(context.items()))

    def get_success_url(self):
        return reverse_lazy("main")

def logout_from_site(request):
    logout(request)
    return redirect("authentication")
    # return render(request, "food/auth_page.html")

def profile(request):
    card_info = Recipe.objects.filter(user=request.user)
    return render(request, "food/profile.html", {"cards" : card_info})

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

def index(request):
    page_object = None
    search_query = request.GET.get("search", "")
    if search_query:
        card_info = Recipe.objects.filter(recipe_title__icontains=search_query)
        paginator = Paginator(card_info, 20)

    else:
        card_info = Recipe.objects.all()
        paginator = Paginator(card_info, 20)
        page_number = request.GET.get("page")
        page_object = paginator.get_page(page_number)

    return render(request, "food/main_jinja.html", {
        "cards": card_info,
        "page_object": page_object
        })

При таком использовании, у вас переменная
page_object существует во всей области видимости функции


Почему работает неправильно код?
Подскажите пожалуйста, в чём проблема?
"Текстовый файл состоит не более чем из 1 200 000 символов X, Y, и Z. Определите максимальное количество идущих подряд символов, среди которых нет подстроки XZZY"
Файл не могу загрузить.
<code>
f = open('24_3.txt').readline()
k = 1
m = 1
for i in range(1, len(f) - 1):
    if f[i] == 'X' and f[i + 1] == 'Z' and f[i + 2] == 'Z' and f[i + 3] == 'Y':
        k = 1
    else:
        k += 1
    m = max(m, k)
print(m)
</code>
Но выдаётся неправильный ответ

То что происходит в функции
max_proper_substr лучше всего нарисовать:
Точками обозначены последовательности символов в которых нет комбинации
XYYZ.

первая подстрока             третья подстрока
|                            |
-------------                ------------------
..........XZZY..............XZZY............XZZY........
           --------------------              -----------
           |                                 |
           вторая подстрока                  четвёртая

Подстроки свободные от
XZZY обозначены пунктирными линиями. Как видите они перекрываются. Код ниже учитывает это:

def max_proper_substr(text):
    max_length = 0
    start = 0
    while True:
        end = text.find('XZZY', start)
        if end == -1:
            length = len(text) - start
            max_length = max(max_length, length)
            break
        length = end - start + 3
        max_length = max(max_length, length)
        start = end + 1
    return max_length

Читать файл тоже надо умеючи. В хвосте файла, скорее всего будет перевод строки, который надо убрать вызовом
strip. Иначе он может быть зачтён в длину последней подстроки.

with open('24_3.txt') as f:
    text = f.read().strip()

Код выше правильно решает поставленную задачу при любых входных данных. То что в ЕГЭ только один тест и строка в середине позволяет срезать угол. Я срезать угол не стану, а покажу ещё одно правильное полное решение. Идея в том чтобы разбить текст на фрагменты, а затем увеличить длину фрагментов на шесть, если они внутри, и на три, если с краю. Код правильно сработает даже если фрагмент один:

def max_proper_substr2(text):
    lengths = [len(s) for s in text.split('XZZY')]
    lengths[0] -= 3
    lengths[-1] -= 3
    return 6 + max(lengths)

P.S. Константы
3 и
6 в коде заменяются на значения зависящие от длины "запрещённой" подстроки. Оба решения можно обобщить для любых "запрещённых" подстрок. Но не всё так просто.
Упражение 1 Придумайте "запрещённую" строку для которой второе решение будет давать неправильные ответы.
Упражение 2 Покажите что первое решение работает для любых "запрещённых" строк.


перемножить нужные индексы из двух разных списков
Всем привет!
Задание такое:

Sample Input:

a3b4c2e10b1

Sample Output:

aaabbbbcceeeeeeeeeeb

Мое решение:

user_print = list(map(str, input().split()))
#numb_list = user_print.split()
print(user_print)
alph_list = []
num_list = []
for i in user_print[0]:
    if i.isalpha():
        alph_list.append(i)

    elif i.isdigit():
        num_list.append(i)
        num_list = list(map(int, num_list))

for a in alph_list:
    for j in num_list:
        result = a * j
        print(result, end="")

Получается 'aaaaaaaaaaabbbbbbbbbbbccccccccccceeeeeeeeeeebbbbbbbbbbb' вместо 'aaabbbbcceeeeeeeeeeb'.
Проблема в том, что не получается умножить букву только на следующее после нее число, она умножается на все числа. Как тут быть?

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

import re

strng = 'a1b2c3g10'

out = re.sub('(\w)(\d+)', lambda x: x[1]*int(x[2]), strng)

Вывод

abbcccgggggggggg


Как совместить текстовые команды и слэш команды в боте дискорд
Добавил в бота дискорд слэш команды, но перестали работать текстовые. Не понимаю с чем это связанно и как решить эту проблему.
<code>
import disnake
from disnake.ext import commands

client = commands.Bot(command_prefix=commands.when_mentioned, sync_commands_debug=True, test_guilds= [968372517326708786])

@client.event
async def on_ready():
    print('We have logged in as {0.user}'.format(client))

@client.slash_command(description="Команды")
async def cmds(inter):
    await inter.response.send_message("Команды:\nКу\nПривет\nДаров\nХай\nСалам\nШалом\nhelp\ninfo")

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    prefix = "&"
    if message.content.startswith(prefix + 'Привет'):         #Привет
        await message.channel.send('Hello!')
    if message.content.startswith(prefix + 'привет'):
        await message.channel.send('Hello!')
#    if message.content.startswith(prefix + 'Прив'):           #Прив
#        await message.channel.send('Hello!')
#    if message.content.startswith(prefix + 'прив'):
#        await message.channel.send('Hello!')
#    if message.content.startswith(prefix + "Всем привет"):    #Всем привет
#        await message.channel.send('Привет!')
#    if message.content.startswith(prefix + "всем привет"):
#        await message.channel.send('Привет!')
    if message.content.startswith(prefix + "Ку"):             #Ку
        await message.channel.send('Даров!')
    if message.content.startswith(prefix + "ку"):
        await message.channel.send('Даров!')
    if message.content.startswith(prefix + "Хай"):            #Хай
        await message.channel.send('Приветик!')
    if message.content.startswith(prefix + "хай"):
        await message.channel.send('Приветик!')
    if message.content.startswith(prefix + "Даров"):          #Даров
        await message.channel.send('Хай!')
    if message.content.startswith(prefix + "даров"):
        await message.channel.send('Хай!')
    if message.content.startswith(prefix + "Салам"):          #Салам
        await message.channel.send('Салют!')
    if message.content.startswith(prefix + "салам"):
        await message.channel.send('Салют!')
    if message.content.startswith(prefix + "Шалом"):           #Шалом
        await message.channel.send('Здрасьте!')
    if message.content.startswith(prefix + "шалом"):
        await message.channel.send('Здрасьте!')
    if message.content.startswith(prefix + "help"):
        emb = discord.Embed(title="Нужна помощь? Я откликаюсь на:", description="\n&Привет\n&Всем привет\n&Ку\n&Хай\n&Даров\n&Салам\n&Прив\n&Шалом")
        await message.channel.send(embed=emb)
    if message.content.startswith(prefix + "info"):
        emb = discord.Embed(title="Обо мне", description="\nПросто бот. Создан **@Bad Boy#4708** 05.05.2022. В даный момент нахдится на бета тесте на сервере AlexGyver community\n\nВерсия 1.0 beta")
        await message.channel.send(embed=emb)

client.run(TOKEN)
</code>

Чтобы создавать команды не нужно делать проверки с
startswith в
on_message

client = commands.Bot(command_prefix=!, intents=discord.Intents.all())

Сделали префикс
!(для примера). А дальше создаёте асинхронные функции, например:

@client.command(aliases=['удалить'])
async def delete(ctx, amount: int=None)
    await ctx.channel.purge(limit=amount)
    await ctx.send(f'Удалено {amount} сообщений!')

Тогда не будет проблем с слеш и текстовыми командами.


как узнать, является ли путь настоящим? [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

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

Закрыт 1 год назад.

                        Улучшить вопрос

Я уже пробовал это:
<code>
import pathlib
from pathlib import Path

if Path(input_file_location.get()).is_file():

    messagebox.showerror("Ошибка", "Данные не являются действительным путём")
</code>
Но если я ввожу не верный путь, то ничего не происходит.

Я нашёл ответ, нужно в место
.is_file написать
is_dir


Нужен код, который удаляет последние сообщение в отдельном чате дискорда
По хорошему код должен начинаться
<code>
@bot.event
async def on_message(message):
</code>

Если я что-то не так понял, прокомментируйте своё сообщение, я попробую исправить ошибку. Вообще легче всего делать подобное с помощью команды.
<code>
@bot.event
async def on_message(message):
    if message.channel.id == ид канала:
        await message.delete()
</code>


Как проиграть музыку в пайтон?
Мне нужно чтобы человек вписывал в input название музыки и чтобы она врубалась, при этом не скачивая саму музыку.
<code>
from tkinter import *

def click():
    name = inp.get()
    #play music

root = Tk()
root.title("Sig Music")
root['bg'] = "black"

inp = Entry().pack()
butt = Button(text="On", command=click).pack()

root.mainloop()
</code>

попробуй изучить модуль PYO и банально написать музыку сразу в python в другом же случае музыка должна быть у тебя на устройстве


Python - суммирование внутри списка с заданным шагом
Всем привет.
Озадачила следующая ситуация.
Есть некий список mList длиной 60 значений, которые мне нужно просуммировать с шагом 20.
скрипт ниже, дает неверные значения

import numpy as np
res=[]
for i in range(0,len(mList),20):
    r=np.sum(mList[i:i+20])
    res.append(r)
print(res)

Но верные ответы получаются если складывать "по индексу" в таком виде

np.sum(mList[0:20])
np.sum(mList[21:40])
np.sum(mList[41:60])

Озадачило в том числе то, что в тестовом списке результаты получились верные.

import numpy as np
mList=[1,1,1,2,2,2,3,3,3]

res=[]
for i in range(0,len(mList),3):
    r=np.sum(mList[i:i+3])
    res.append(r)
print(res)

Прошу подсказать как можно получить правильные ответы через for?
Фактический список будет содержать несколько тысяч значений...

Код автора без
numpy и с тестовым списком и моими комментами ниже. Код работает правильно. Правильно он будет и с
numpy работать, как ясно из ответа @CrazyElf, кто нашёл причину. Менять в самом коде ничего не надо.

res=[]
# Создлание тестового списка со значениями от 1 до 60 по порядку.
mList = [i for i in range(1,61)]
for i in range(0,len(mList),20):
    r=sum(mList[i:i+20])
    res.append(r)
# Печатает верно суммы: [210, 610, 1010]
print(res)


Обратиться к элементу списка словарей
Имеется набор данных DataFrame. В нем столбец key_skills. В key_skills в каждой строке либо пустой список, либо список словарей в формате:

 [{'name': 'PHP'}, {'name': '1С-Битрикс'}, {'name': 'Git'}, {'name': 'MySQL'}, {'name': 'CSS3'}, {'name': 'ООП'}, {'name': 'API'}, {'name': 'HTML5'}]

Как считать каждый элемент name? То есть получить значения: PHP, 1С-Битрикс, Git, MySQL и т.д.
Так получаю значения словаря в столбце, но для списка словарей это не работает:

df['skills'] = df['key_skills'].map(lambda x: x.get("name", np.nan) if isinstance(x, dict) else np.nan)

Ну, соответственно, перебираете этот список и к его элементам применяете эту вашу функцию:
<code>
df['skills'] = df['key_skills'].map(lambda y: [x.get("name", np.nan) if isinstance(x, dict) else np.nan for x in y])
</code>
Ну там ещё можно что-то подкрутить, не совсем понятно, что нужно в итоге получить.

key_skills
skills

0
[{'name': 'PHP'}, {'name': '1С-Битрикс'}, {'na...
[PHP, 1С-Битрикс, Git, MySQL, CSS3, ООП, API, ...

1
[]
[]


Ошибка при бинарном поиске
Попытался написать алгоритм нахождения бинарного поиска, получилось очень криво, конечно, в целом алгоритм работает нормально. правильно, но иногда происходит бесконечный цикл, почему это происходит не могу понять.. Если вписать 186, то произойдет бесконечный цикл.. Помогите пожалуйста.. Когда написал вопрос допустил ошибки, сейчас подправил.
<code>

import random

#Рандом можно использовать, я добавил да бы постоянно не прописывать разные наборы чисел. В данный момент, он бесполезен.
def rando(r):
    while r <= 200:
        rand = random.randint(1, 25)
        r = random.randrange(chisla[-1], chisla[-1] + rand)
        if r in chisla:
            continue
        else:
            chisla.append(r)
    return chisla

chisla = [0, 1, 13, 21, 33, 40, 49, 53, 55, 63, 67, 68, 70, 80, 83, 89, 98, 104, 119, 132, 140, 142, 153, 173, 176,
          186, 188, 192, 195, 199, 200, 201]
r = 1
#rando(r)
print(len(chisla))
print(chisla)
print('Введите число, номер которого вы хотите узнать:')
#Если в переменную ниже ввести число 186, то будет бесконечный цикл, если другое  число то цикла нет...
Nuj_Chislo = int(input()) #Ввод числа, порядковый номер которого хотим узнать.
i = int()
a = 1
if len(chisla) / 2 != 0: # Этот if для проверки на четность или не четность длины списка.
    a = int((len(chisla) + a) / 2) #Нахождение индекса числа середины списка.
if Nuj_Chislo > chisla[a]: # Здесь происходит проверка, если нужное число больше чем индекс числа находящийся в середине списка.
    c = len(chisla)
    a = int(c / 2)
    while chisla[a] != Nuj_Chislo:
        if Nuj_Chislo > chisla[a]: #Проверка больше ли число, проверка чисел в половины, и дальше четверти, 1/8.. и т.д.
            i = a
            a = int((len(chisla) + i) / 2)#Проверка меньше ли число, проверка чисел в половины, и дальше четверти, 1/8.. и т.д.
        elif Nuj_Chislo < chisla[a]:
            a = int((i + 1) / 2)
            i = a
elif Nuj_Chislo < chisla[a]:# Здесь происходит проверка, если нужное число меньше чем индекс числа находящийся в середине списка.
    a = int((a + 1) / 2)
    while chisla[a] != Nuj_Chislo:
        if Nuj_Chislo > chisla[a]:
            a = int((len(chisla) + i) / 2)
            i = a
        elif Nuj_Chislo < chisla[a]:
            i = a
            a = int((i + 1) / 2)
print(a)
</code>

С середины кода я вставил простую реализацию. проверил для 186 - прекрасно работает.
Сравните со своим кодом, поймите, почему у вас он такой громоздкий. На будущее - видите, что ваш код принимает странный вид - либо думайте сами, либо ищите в интернете, всё ли у вас правильно с алгоритмом или с методом реализации алгоритма. Простота реализации должна быть ведущим принципом.
<code>
import random

def rando(r):
    while r <= 200:
        rand = random.randint(1, 25)
        r = random.randrange(chisla[-1], chisla[-1] + rand)
        if r in chisla:
            continue
        else:
            chisla.append(r)
    return chisla

chisla = [0, 1, 13, 21, 33, 40, 49, 53, 55, 63, 67, 68, 70, 80, 83, 89, 98, 104, 119, 132, 140, 142, 153, 173, 176,
          186, 188, 192, 195, 199, 200, 201]
r = 1
rando(r)
print(len(chisla))
print(chisla)
print('Введите число, номер которого вы хотите узнать:')
#Если в переменную ниже ввести число 186, то будет бесконечный цикл, если другое  число то цикла нет...
Nuj_Chislo = int(input())

# Ниже нормальный простой рабочий алгоритм
mid = len(chisla)//2
low = 0
high = len(chisla) - 1

while chisla[mid] != Nuj_Chislo and low <= high:
    if Nuj_Chislo > chisla[mid]:
        low = mid + 1
    else:
        high = mid - 1
    mid = (low + high) // 2

if low > high:
    print("Нет числа")
else:
    print("номер:", mid)
</code>


все привет !помогите)не работает импорт Beautifulsoup в питоне .не высвечивается и поэтому мой код видимо не работает
<code>
    import requests
    from bs4 import BeautifulSoup as BS:

    def get_response(url):
        response = requests.get()
        if response.status_code == 200:
            return response.text
        else:
            return "Не успешный запрос "

    my_url = "сюда написала сайт который мне нужен"
    print(get_response(my_url))
</code>

Во второй строчке не должно быть двоеточия
<code>
    import requests
    from bs4 import BeautifulSoup as BS

    def get_response(url):
        response = requests.get()
        if response.status_code == 200:
            return response.text
        else:
            return "Не успешный запрос "

    my_url = "сюда написала сайт который мне нужен"
    print(get_response(my_url))
</code>


Как найти все слова, которые имеют только одну Заглавную букву в строке и не имеют числа?
Нужна помощь с решением регулярных выражений.
Задача проста, нужно найти все слова, которые имеют только одну Заглавную букву в строке и не имеют числа.
Я пытался что-то вроде такого сделать, но безуспешно:
<code>
import re
pattern = r"\b\w[а-яА-ЯёЁ]\w+(?![0-9])\b"
result = re.findall(pattern, 'Яблоко яБлоко ябЛоко яблОко яблоКо яблокО яблоко7 яблоко')
print(result)
</code>
Я очень плохо понимаю как устроены регулярные выражения. Помогите решить задачу и объясните мне потом, пожалуйста, почему именно так нужно сделать.

Если вы хотите использовать регулярные выражения, установите библиотеку PyPi regex с помощью
pip install regex используйте

import regex
pattern = r"\b\p{Ll}*\p{Lu}\p{Ll}*\b"
text = 'Яблоко яБлоко ябЛоко яблОко яблоКо яблокО яблоко7 яблоко'
result = regex.findall(pattern, text)
print(result)
# => ['Яблоко', 'яБлоко', 'ябЛоко', 'яблОко', 'яблоКо', 'яблокО']

См. пример выполнения кода.
Если регулярные выражения использовать необязательно, вы можете использовать

import re, sys
uc_letters = [chr(i) for i in range(sys.maxunicode) if chr(i).isupper()]
text = 'Яблоко яБлоко ябЛоко яблОко яблоКо яблокО яблоко7 яблоко'
print( [slovo for slovo in text.split() if all(c.isalpha() for c in slovo) and len([c for c in slovo if c in uc_letters]) == 1 ] )
# => ['Яблоко', 'яБлоко', 'ябЛоко', 'яблОко', 'яблоКо', 'яблокО']

См. пример кода.
Подробности:

uc_letters - список всех заглавных букв Юникода

[slovo for slovo in text.split()... - разбивает строку на слова по пробельным символам, а затем оставляет только те, которые

if all(c.isalpha() for c in slovo) and... состоят целиком из букв и

len([c for c in slovo if c in uc_letters]) == 1 ] в которых имеется только одна заглавная буква.


Множественные ветвления if в python
Всем привет!
Заранее, прошу прощения если не туда попал, я только учусь. :-)
В настоящий момент прохожу онлайн курс в Яндекс практикуме. Читаю условия решаю задачи.
И вот на моем пути повстречалась следующая задача:
Задача 2
Готовим завтрак. В зависимости от наличия продуктов есть разные варианты меню:
Если есть молоко (milk) и хлопья (cereals) — можно позавтракать хлопьями с молоком.
Если есть яйца (eggs) — на завтрак будет яичница.
Если есть молоко и яйца — можно сотворить омлет.
Есть и более бюджетные варианты: попить молока, погрызть сухих хлопьев или вовсе не завтракать.
Прочтите код, отследите логику ветвления.
Подставьте вместо многоточия такой логический оператор, с которым программа будет работать корректно.
<code>
# Продуктов маловато:
milk = not True       # Молоко "НЕ есть".
cereals = True        # Хлопья есть.
eggs = False          # Яиц нет.

# Вставьте логический оператор вместо многоточия.
# Решите, нужно ли расставить скобки.

if milk and cereals or eggs:
    if eggs:
        if milk:
            breakfast = "- омлет"
        else:
            breakfast = "- яичница"
    else:
        breakfast = "- хлопья с молоком"
else:
    if milk:
        breakfast = "- стакан молока"
    elif cereals:
        breakfast = "можно погрызть сухих хлопьев"
    else:
        breakfast = "ничего не будет: разгрузочный день"

print("Сегодня на завтрак", breakfast)
</code>
Саму задачу решил быстро, путем перебора or и and.
Но, интересно понять, как же этот код работает.
Мне не понятно, выражение "if milk and cereals or eggs:" Возвращает что-то одно, правду или ложь.
Как python делает выбор между аж шести вариантами? Как он понимает, что если нужно выбрать из if - блока правды ветку лжи?

Запускаем в голове интерпретатор. Начальные значения:

milk = False
cereals = True
eggs = False

Как вычислить выражение для ингредиентов?

milk and cereals or eggs

расставляем скобки (в этом примере это не важно, в других может повлиять):

(milk and cereals) or eggs

подставляем значения:

(False and True) or False

вычисляем скобки (нужна таблица истинности для
and):

False or False

вычисляем выражение (нужна таблица истинности для
or):

False

Значит мы попали в ветку
else:

    if milk:
        breakfast = "- стакан молока"
    elif cereals:
        breakfast = "можно погрызть сухих хлопьев"
    else:
        breakfast = "ничего не будет: разгрузочный день"

milk - ложь, пропускаем
if. Проверяем
elif:
cereals - истина, выполняем "погрызть", покидаем все условные операторы.


Объекту класса передать словарь
В коде два класса. В базовом создан словарь. Подскажите как при создании объекта производного класса присвоить ему значение этого словаря и дальше с ним работать как со словарём используя стандартные методы?
Код:

class Gifts:

    def __init__(self):
        self.gifts = dict()

    def add(self, value):
        if value in self.gifts.keys():
            self.gifts[value] = int(self.gifts[value]) + 1
        else:
            self.gifts[value] = 1

    def get_gifts(self):
        return sorted(list(self.gifts.keys()))

    def __repr__(self):
        return 'Gifts()'

class GhostGifts(Gifts):
    pass

Пример ввода:

gg = GhostGifts()
print(gg[key])
print(len(gg))

Необходимый вывод:

value
32

Для того чтобы использовать оператор [] нужно перегрузить такой магический метод, как getitem, а для вывода в термина str, выглядеть это будет вот так:

class Gifts:

    def __init__(self):
        self.gifts = dict()

    def add(self, value):
        if value in self.gifts.keys():
            self.gifts[value] = int(self.gifts[value]) + 1
        else:
            self.gifts[value] = 1

    def get_gifts(self):
        return sorted(list(self.gifts.keys()))

    def __repr__(self):
        return 'Gifts()'

    # Для оператора []
    def __getitem__(self, item):
        return self.gifts[item]

    # Для print()
    def __str__(self):
        return ''.join(f'key: {key}, value: {value};\n' for key, value in self.gifts.items())

class GhostGifts(Gifts):
    pass

someGift = GhostGifts()
someGift.add(4)
someGift.add('SomeStr')
print(someGift[4])
print(someGift)

Вывод:

1
key: 4, value: 1;
key: SomeStr, value: 1;

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


Регулярное выражение для поиска слов, состоящих целиком из строчных букв
Мне нужна помощь в составлении регулярного выражения. Мне нужен такой запрос.
Найти все слова,которые не имеют в начале, в середине и в конце заглавных букв, то есть слово должно быть полностью со строчными буквами.
Пример кода, который я пытался реализовать:
<code>
import re
pattern = r"\b[^A-Z]\w[^A-Z]\w+\b"
result = re.findall(pattern, 'Tort tOrt tort tOrt')
print(result)
# должен быть tort, но выводит ['tOrt', ' tort', 'tOrt']
</code>
Но пока выводит все слова, который Не имеют в начале заглавных букв. Что мне нужно дописать в такое регулярное выражение, чтобы оно выполняло данную задачу.

Если вы работаете не только с ASCII, лучше всего установить библиотеку PyPi regex, введя в консоли
pip install regex, и затем использовать следующий код:

import regex
text = '...'
print( regex.findall(r'\b\p{Ll}+\b', text) )
print( regex.findall(r'\b[[:lower:]]+\b', text) )

где

\b - граница слова

[[:lower:]]+ /
\p{Ll}+ - одна более букв в нижнем регистре

\b - граница слова.

Пример кода:

import regex
text = 'Tort tOrt tort Торт тОрт торт'
print( regex.findall(r'\b\p{Ll}+\b', text) )       # => ['tort', 'торт']
print( regex.findall(r'\b[[:lower:]]+\b', text) )  # => ['tort', 'торт']

Если нет возможности установить PyPi
regex, используйте

import re, sys
pLl = "".join([chr(i) for i in range(sys.maxunicode) if chr(i).islower()])
text = 'Tort tOrt tort Торт тОрт торт'
print( re.findall(fr'\b[{pLl}]+\b', text) ) # => ['tort', 'торт']

См. пример кода.


Как получить contact в aiogram?
Не получается заполучить данные о контакте, которые отправляются пользователем.
<code>
@dp.message_handler(state=Person.age)
async def get_age(msg: types.Message):
    if func.check_age_sym(msg.text):
        if func.check_age(int(msg.text)):
            keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
            keyboard.add(types.KeyboardButton(text="Отправить номер телефона 📱", request_contact=True))

            await msg.answer("Отправь свой контакт:", reply_markup=keyboard)
            await Person.contact.set()
    else:
        await msg.answer(emoji.emojize(config.text['err_age']), parse_mode=types.ParseMode.HTML)
        return

@dp.message_handler(state=Person.contact)
async def contacts(msg: types.Message, state: FSMContext):
    await msg.answer(f"Твой номер успешно получен: {msg.contact.phone_number}", reply_markup=types.ReplyKeyboardRemove())
    await state.finish()
</code>
У меня ничего не происходит, когда отправляю контакт. Что не так с кодом?

Нужно в хендлере ловить конкретный тип апдейта
<code>
@dp.message_handler(content_types=types.ContentType.CONTACT, state=Person.contact)
async def contacts(msg: types.Message, state: FSMContext):
    await msg.answer(f"Твой номер успешно получен: {msg.contact.phone_number}", reply_markup=types.ReplyKeyboardRemove())
    await state.finish()
</code>


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

a = np.array((1, 2, 5))
b = np.array((2, 3, 5, 10, 20))

Правильный результат:

array([2, 5])

result = np.array(set(a).intersection(b))

Объяснение:

set(a) создает из поля
а множество.
На это множество применим метод
intersection(b), который сделает его пересечение с полем
b (автоматически конвертированном тоже на множество).
Затем из этого пересечения сделаем обратно поле NumPy.


Проверка типов данных в функции
Если в функцию передаётся кортеж, то посчитать длину всех его слов.
Если список, то посчитать кол-во букв и чисел в нём.
Число – кол-во нечётных цифр.
Строка – количество букв.
Сделать проверку со всеми этими случаями.
<code>
    `def func(a):`
        `If a== tuple():`
        `Return map(len(a.split()))`
        `If a== float():`
        `Return len(str(a))`
        `If a== str():`
        `Return len([i for i in a if  i.isalpha()])`
</code>
Что я не так делаю?

Советую использовать для проверки типов функцию isinstance(arg1, classinfo), где первый аргумент - это объект, тип которого нужно проверить, а второй это тип с которым нужно проверять(можно указывать несколько типов). И как было отмечено выше, приписывая у типа () вы вызываете их конструктор, который в свою очередь возвращает новый объект, сравнение с которым особого смысла не имеет. К тому же, использование "==" для проверки принадлежности к какому-либо типу может вызывать проблемы, хотя в вашем конкретном случае они маловероятны.


Написать декоратор [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

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

Закрыт 1 год назад.

                        Улучшить вопрос

декоратор должен записывать в файл  во сколько начала отрабатывать декорируемая функция и во сколько закончила

Декоратор - функция, которая оборачивает другую функцию, добавляя ей желаемое поведение.
<code>
from datetime import datetime
import time

# декорируемая функция
def timer():
    print("0")
    time.sleep(1)
    print("1")
    time.sleep(1)
    print("2")
    time.sleep(1)
    print("3")

# декоратор
def timer_logger():
    with open('log.txt', 'a') as file:
        timer_logger_start(file)
        timer()
        timer_logger_end(file)

# начало декоратора
def timer_logger_start(file):
    file.write(str(datetime.now()) + "\n")

# конец декоратора
def timer_logger_end(file):
    file.write(str(datetime.now()) + "\n")

# точка входа в программу
if __name__ == '__main__':
    timer_logger()
</code>


Декодировать строку Python
Моя программа выдает мне закодированный текст. Как в питоне я могу такое расшифровать?
=?UTF-8?B?0J/RgNC+0LLQtdGA0LrQsDE=?=

Это mime headers (RFC 2047). Используется в email. В питоне есть модуль для работы с этим.

from email.header import decode_header
bstr, encoding = decode_header('=?UTF-8?B?0J/RgNC+0LLQtdGA0LrQsDE=?=')[0]
decoded = bstr.decode(encoding)
print(decoded)

Результат

Проверка1


Как вызвать рандомную функцию в другой функции?
Задача: вызвать функцию, которая будет вызывать рандомную фунцию.
Не понимаю пока как это сделать
<code>
import random

def main():
   all_func = [func1(), func2(), func3()]
   get_random = random.choice(all_func)

def func1():
    return "Первая"

def func2():
    return "Вторая"

def func3():
    return "Третья"

if __name__ == "__main__":
    main()

</code>

import random

def main():
    all_func = [func1, func2, func3]
    get_random = random.choice(all_func)
    return get_random()

def func1():
    print('Первая')
    return

def func2():
    print('Вторая')
    return

def func3():
    print('Третья')
    return

if __name__ == "__main__":
    main()


Дублирование шаблонов Django
Создал проект с несколькими приложениями (
auth,
blog). В каждом приложении создал папку
templates. Но
base.html для этих приложений одинаковый. Не хочется дублировать
html код несколько раз, если какой-то другой вариант?

Шаблоны можно наследовать из соседнего приложения, также как и из текущего. Следующая запись будет справедлива для шаблона в приложении
blog и для шаблона в приложении
auth, если
base.html находится в папке
blog:

{% extends "blog/base.html" %}

Но я помещаю шаблоны в общую директорию в корне проекта, мне кажется это более очевидным и удобным. Для этого нужно добавить путь к директории в
settings.py:

TEMPLATES = [
    {
        ...
        "DIRS": [os.path.join(BASE_DIR, "templates")],
        ...
    },
]

Пример структуры директории
templates:

templates
├── blog
│   ├── post_creation.html
│   ├── post_detail.html
│   ├── post_list.html
│   ├── post_multiple_creation.html
│   └── post_multiple_creation_success.html
├── auth
│   ├── logged_out.html
│   ├── login.html
│   ├── profile_edit.html
│   ├── profile.html
│   ├── registration.html
│   └── registration_success.html
├── 403.html
└── base.html