Поиск в сломанном массиве
Выдает в двух тестах -1
вот сама задача:
Алла ошиблась при копировании из одной структуры данных в другую. Она хранила массив чисел в кольцевом буфере. Массив был отсортирован по возрастанию, и в нём можно было найти элемент за логарифмическое время. Алла скопировала данные из кольцевого буфера в обычный массив, но сдвинула данные исходной отсортированной последовательности. Теперь массив не является отсортированным. Тем не менее, нужно обеспечить возможность находить в нем элемент за
O
(
log
n
)
.
Можно предполагать, что в массиве только уникальные элементы.
<code>
def broken_search(nums, target) -> int:
    start = 0
    end = len(nums) - 1
    mid = end // 2
    if end == 0:
        if nums[0] == target:
            return 0
        return -1
    while start < end - 1:
        left = nums[start]
        middle = nums[mid]
        if target == middle:
            return mid
        elif target < middle:
            if left >= target:
                return binary_search(nums, target, start, mid)
            end = mid
            mid = (start + end + 1) // 2
        else:
            if target <= nums[end]:
                return binary_search(nums, target, mid, end)
            start = mid
            mid = (start + end + 1) // 2
    return -1

def binary_search(nums, target, start, end) -> int:
    if start >= end:
        if nums[end] == target:
            return start
        return -1
    mid = (start + end) // 2
    if target == nums[mid]:
        return mid
    elif target < nums[mid]:
        return binary_search(nums, target, start, mid - 1)
    else:
        return binary_search(nums, target, mid + 1, end)

if __name__ == '__main__':
    array = [19,21,100,101,1,4,5,7,12]
    print(broken_search(array, 50))
</code>

Решил не разбираться в вашем коде, но предоставить альтернативное решение. Сначала была идея воспользоваться бинарным поиском для нахождения сдвига. Но потом реализовал вот так:

def binary_search_for_broken(arr: list, search_value: int) -> int:
    start_value  = arr[0]
    start = 0
    end = len(arr) - 1
    while start <= end:
        middle = start + (end-start) // 2
        if search_value == arr[middle]:
            return middle
        if (arr[middle] < start_value) is not (search_value < start_value) or (arr[middle] > search_value):
            end = middle - 1
        else:
            start = middle + 1
    return -1

array = [19,21,100,101,1,4,5,7,12]
print(binary_search_for_broken(array, 1))
print(binary_search_for_broken(array, 50))
print(binary_search_for_broken(array, 12))
print(binary_search_for_broken(array, 101))

вывод соответственно

4
-1 # этого элемента в массиве не существует
8
3


'float' object is not callable хотя я пробовал удалять скобки и/или менять тип с помощу int()

import turtle
from win32api import GetSystemMetrics
import objects

win_w = GetSystemMetrics(0)
win_h = GetSystemMetrics(1)

window = turtle.Screen()
x1 = -(win_w / 2) + (0.065 * win_w)
x2 = (win_w / 2) - (0.065 * win_w)
window.bgcolor("black")
window.setup(win_w, win_h)
window.tracer()

player_1 = objects.Game_element([x1, 0], 5, 1)

player_2 = objects.Game_element([x2, 0], 5, 1)

ball = objects.Game_element([0, 0], 1, 1)

window.listen()

def up_1():
    player_1.sety(player_1.ycor() + 10)

window.onkeypress(up_1, "w")

while True:
    window.update()

Файл Objects.py:

 import turtle

class Game_element():
    def __init__(self, goto,x,y):
        self = turtle.Turtle()
        self.color("white")
        self.shape("square")
        self.penup()

        self.shapesize(x,y)
        self.goto(goto)

    def ycor(self):
        self._ycor = turtle.ycor()
        return self._ycor

    def sety(self,y):
        self._sety = turtle.sety(y)
        return self._sety

Вы зря сделали одинаковое название и у метода и у поля класса. Упрощу ситуацию для понятности:

class Game_element():

    def ycor(self):
        self.ycor = 3.14 # <-- ПРОБЛЕМА ТУТ
        return self.ycor

player1 = Game_element()
y = player1.ycor() # первый вызов будет успешным
y = player1.ycor() # а второй вызов уже не получится

Выходит ошибка на втором вызове:

TypeError                                 Traceback (most recent call last)
<ipython-input-51-3595c07fa764> in <module>()
      7 player1 = Game_element()
      8 y = player1.ycor()
----> 9 y = player1.ycor()

TypeError: 'float' object is not callable

После выполнения строки
self.ycor = turtle.ycor() переменная
ycor экземпляра класса
player1 больше не указывает на метод
def ycor(), она указывает на значение, полученное через вызов
turtle.ycor(), а там видимо число с плавающей точкой. Поэтому такая ошибка.
Назовите метод класса как-то по-другому, не также, как называется поле. Для того, чтобы не было такой путаницы, часто принимают такую конвенцию - называть поля класса с подчёркиванием перед именем. Тогда вы их точно не перепутаете с методами. Например, так:

def ycor(self):
    self._ycor = turtle.ycor()
    return self._ycor


сравнение значений int и str
Подскажите, у меня есть функция поиска по ключу в стеке (выводит индекс элемента)

def find(self, key):
        temp = self.head
        i = 1
        while temp is not None:
            if key == temp.element:
                return i
            temp = temp.next_node
            i += 1
        return -1

затем выполняю заполнение стека и ввожу значение, индекс которого нужно найти

stack.push(2)
stack.push("a")
stack.push(3)
stack.push(4)
stack.push("b")

print(stack.find(input()))

если я ввожу в input() число,например, 3, то возвращает значение -1, то есть как будто такого числа в стеке нет. я понимаю, что это происходит, так как в input() - строковое значение и можно сделать int(input()). но я хочу сделать стек универсальным, чтобы работало и для str и для int.

Приводите оба сравниваемых значения к строкам, и тогда уже сравнивайте, тогда будет находить и числа и строки:
<code>
if str(key) == str(temp.element):
    return i
</code>
Это в случае, если вы хотите сохранить тип помещаемых в стек элементов. Если сохранение типа не нужно, то помещайте элементы сразу приведя к строке и ищите тоже приведя искомое к строке.


При отправке формы на сайте не отправляется id user'а. Django
Помогите с проблемой
ОШИБКА:  значение NULL в столбце "user_id" отношения "todos_category" нарушает ограничение NOT NULL
DETAIL:  Ошибочная строка содержит (11, asd, asd, null).
forms.py:

class CategoryCreateForm(forms.ModelForm):
    class Meta:
        model = Category
        fields = [
            'name',
            'description',
            ]

В fields засунуть user_id я не могу, так как user_id должен автоматически добавляться в форму в зависимости от нынешнего юзера.. Вот только как это сделать я не очень понимаю.
views.py:

def category_create(request):
    form = CategoryCreateForm()
    if request.method == "POST":
        form = CategoryCreateForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect("category_list")
    context = {'form':form}
    return render(request, 'todolist/category_create.html', context)

models.py:

class Category(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    description = models.TextField(blank=True)

null=True в поле я ставить не могу((

Тогда попробуйте так
<code>
def category_create(request):
    if not request.user.is_authenticated:
        raise Exception('AUTH PLEASE')

    form = CategoryCreateForm()
    if request.method == "POST":
        form = CategoryCreateForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.user = request.user
            obj.save()
            form.save_m2m()
            return redirect("category_list")
    context = {'form':form}
    return render(request, 'todolist/category_create.html', context)
</code>
Если будет исключение 'AUTH_PLEASE' то надо разбираться с вашей авторизацией


Автокорреляции данных
Подскажите пожалуйста можно ли строить прогнозную модель, если среди предикторов есть с данные с автокорреляцией (например объем продаж охладительных напитков значительно зависит от сезона). Судя из определения автокорреляции это приводит к завышению тестовых статистик, по которым проверяется качество модели, т.е. создается искусственное улучшение качества модели относительно её действительного уровня точности.
Не могу понять логику - наличие зависимости объемов продаж от сезона это ведь хорошо для прогноза, это позволяет более точно предположить объемы продаж в будущем. Или я не верно рассуждаю? С другой стороны прочел массу информации о плохом влиянии автокорреляции данных на прогноз.
Посоветуйте как понять значимая моя автокорреляция или нет, как избавиться от автокорреляции или минимизировать ее влияние.

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


Проблема с дешифровкой русских символов
Сделал по гайду кодировку/декодировку сообщений по ключу и цифры/англ. символы кодируются нормально, но русские символы не могут декодироваться обратно
<code>
def encode(key, clear):
    enc = []
    for i in range(len(clear)):
        key_c = key[i % len(key)]
        enc_c = chr((ord(clear[i]) + ord(key_c)) % 256)
        enc.append(enc_c)
    return base64.urlsafe_b64encode("".join(enc).encode()).decode()

def decode(key, enc):
    dec = []
    enc = base64.urlsafe_b64decode(enc).decode()
    for i in range(len(enc)):
        key_c = key[i % len(key)]
        dec_c = chr((256 + ord(enc[i]) - ord(key_c)) % 256)
        dec.append(dec_c)
    return "".join(dec)
</code>
И вместо "сори не дешифруется" получаем "A>@8 =5 45H8DAC5BAO"
Может ошибка в коде декодера или русские символы так кодировать не выйдет?

Сразу переводить строку в байты и работать с ними. Тогда точно не будет потерь после получения остатка от деления на 256.
<code>
def encode(key, clear):
    enc = []
    clear_bytes = clear.encode()
    key_bytes = key.encode()
    for i in range(len(clear_bytes)):
        key_c = key_bytes[i % len(key_bytes)]
        enc_c = (clear_bytes[i] + key_c) % 256
        enc.append(enc_c)
    return base64.urlsafe_b64encode(bytes(enc)).decode()

def decode(key, enc):
    dec = []
    enc_bytes = base64.urlsafe_b64decode(enc)
    key_bytes = key.encode()
    for i in range(len(enc_bytes)):
        key_c = key_bytes[i % len(key_bytes)]
        dec_c = (enc_bytes[i] - key_c) % 256
        dec.append(dec_c)
    return bytes(dec).decode()
</code>


Можно ли быстро привести все аргументы класса к виду self.<аргумент> в функции __init__(self)?
Сейчас я пишу свой класс кнопки в pygame для своей игры. На вход класс получает кучу аргументов. Очень неудобно писать для каждого выражение вида
self.arg = arg. Есть ли какой-нибудь способ привести например список аргументов к виду self.arg?
Например, есть такая ситуация:

def __init__(self, surface, color, x, y, length, height, width, text, text_color, font_size):
    self.surface = surface
    self.color = color
    self.x = x
    self.y = y
    pygame.draw.rect(self.surface, self.color, [self.x, self.y, 50, 50])

А хочется так:

def __init__(self, args): #args - список с элементами surface, color, x и y
    super_function(args)
    pygame.draw.rect(self.surface, self.color, [self.x, self.y, 50, 50])

Можно подобным образом поступить, к примеру, через
*args, **kwargs. Тогда в
self.args будет лежать кортеж переменных, а в
self,kwargs — словарь

class Dummy:

    def __init__(self, *args, **kwargs):
        self.args = args
        self.kwargs = kwargs

dummy = Dummy(1, 2, 3, 5, a = 1.2, b = 1.2, c = 1.3)
print(dummy.args)  # (1, 2, 3, 5)
print(dummy.kwargs)  # {'a': 1.2, 'b': 1.2, 'c': 1.3}

А можно чуть усложнить и сделать через магию установки атрибутов
__setattr__(), если нужны атрибуты, но лень много строк набивать.

class Dummy:

    def __init__(self, *args, **kwargs):
        attr = ['surface', 'color', 'x', 'y']
        for ia, a in enumerate(attr):
            self.__setattr__(a, args[ia])
        self.args = args  # Оставил на всякий случай
        self.kwargs = kwargs

dummy = Dummy(1, 2, 3, 5)
print(dummy.surface)  # 1
print(dummy.color)  # 2
print(dummy.x)  # 3
print(dummy.y)  # 5

В списке
attr задаем необходимые атрибуты, под которые потом из кортежа
args вытаскиваем значения и применяем
__setattr__. Нужно учитывать, что в
args может быть больше параметров, т.к. он ловит все введенные параметры, на количество которых нет ограничения, тогда можно либо весь кортеж
args сохранить, либо обрезать его потом.
Если же параметров будет меньше, то получим отличное от обычного
TypeError (с сообщением о нехватке параметров) исключение в виде
IndexError. Его можно при желании обернуть в
TypeError.


Aiogram Есть ли возможность вывода текста ботом через симуляцию печатания человеком?
Чуть более нормальная формулировка: Нужно, что бы у пользователя сверху появлялась надпись о том, что бот печатает, а через какое-то время (секунды 3 например) всё тому же пользователю приходило сообщение. Такое есть в aiogram ? Или можно это как-то другим способом реализовать, но что-бы главной библиотекой оставался aiogram ?

Да, это реализуется с помощью метода API sendChatAction. В aiogram выглядеть это будет так:
<code>
import asyncio
from aiogram.types import ChatActions

...

await bot.send_chat_action(message.chat.id, ChatActions.TYPING)
await asyncio.sleep(3)
await bot.send_message(message.chat.id, "Test message")
</code>


Python, Методы и атрибуты
Продолжаю изучать Python
Застрял на задачке: Реализовать копилку, пополняемую центами и долларами, начальная сумма в копилке 1 доллар и 1 цент
<code>
class PiggyBank:
def __init__(self, dollars, cents):
    self.dollars = dollars
    self.cents = cents

def add_money(self, deposit_dollars, deposit_cents):
    if deposit_cents + self.cents >= 100:
        self.cents = deposit_cents % 100
        self.dollars += deposit_cents // 100
    else:
        self.cents += deposit_cents
    return(self.dollars, self.cents)
</code>
Выводит:
Тестовый вход:
0 99
Правильный выход:
2 0
Вывод вашего кода:
1 99
Не могу найти ошибку

Можно немного упростить Ваш код:

class PiggyBank:
    def __init__(self, dollars, cents):
        self.dollars = dollars
        self.cents = cents

    def add_money(self, deposit_dollars, deposit_cents):
        self.dollars += deposit_dollars + (self.cents + deposit_cents) // 100
        self.cents = (self.cents + deposit_cents) % 100
        return(self.dollars, self.cents)

bank = PiggyBank(1, 1)
bank.add_money(0, 99)
print(bank.__dict__)  # {'dollars': 2, 'cents': 0}
bank.add_money(1, 0)
print(bank.__dict__)  # {'dollars': 3, 'cents': 0}
bank.add_money(1, 1)
print(bank.__dict__)  # {'dollars': 4, 'cents': 1}

Ваш же код нужно доработать учетом долларов и правильным пересчетом центов:

def add_money(self, deposit_dollars, deposit_cents):
    if deposit_cents + self.cents >= 100:
        self.dollars += deposit_dollars + (deposit_cents + self.cents) // 100
        self.cents = (deposit_cents + self.cents) % 100
    else:
        self.cents += deposit_cents
        self.dollars += deposit_dollars
    return(self.dollars, self.cents)


Как в tkinter изменить цвет окна с помощью радиокнопками?
В tkinter я создал программа который при нажатии на радиокнопка должен изменится цвет окна. Но не знаю как? Здесь я оставлю код программа:
<code>
from tkinter import*
def change_color():
    root=Toplevel()
    root.geometry('600x400')
    root.title('Измените цвет окна')
    var=IntVar()
    var.set(1)
    rad0 = Radiobutton(root,text="Красный", variable=var,value=0).grid(row=1, column=1)
    rad1 = Radiobutton(root,text="Синий", variable=var,value=1).grid(row=2, column=1)
    rad2 = Radiobutton(root,text="Зелёный", variable=var,value=2).grid(row=3, column=1)
    lab_color=Label(root, text='Добавьте HEX код цвета: ', font='Times 24')
    lab_color.grid(row=1, column=3)
    color=Entry(root, width=50, bd=3)
    color.grid(row=2, column=3)

root=Tk()
root.title('Enter a color')
root.geometry('600x400')
root['background']= None #Вот здесь должен применить один из цветов вышеуказанного функция

menubar=Menu(root)
filemenu=Menu(menubar, tearoff=0)
filemenu.add_command(label='Измените цвет окна', command=change_color)
menubar.add_cascade(label="Файл", menu=filemenu)

root.config(menu=menubar)
root.mainloop()
</code>

from tkinter import*
def change_color():
    root=Toplevel()
    root.geometry('600x400')
    root.title('Измените цвет окна')
    var=IntVar()
    var.set(1)
    rad0 = Radiobutton(root,text="Красный", variable=var,value=0, command = red).grid(row=1, column=1)
    rad1 = Radiobutton(root,text="Синий", variable=var,value=1, command = blue).grid(row=2, column=1)
    rad2 = Radiobutton(root,text="Зелёный", variable=var,value=2, command = green).grid(row=3, column=1)
    lab_color=Label(root, text='Добавьте HEX код цвета: ', font='Times 24')
    lab_color.grid(row=1, column=3)
    color=Entry(root, width=50, bd=3)
    color.grid(row=2, column=3)

def red():
    root['background']= '#F00'

def blue():
    root['background'] = '#002AFF'

def green():
    root['background'] = '#55DE00'

root=Tk()
root.title('Enter a color')
root.geometry('600x400')
root['background']= None #Вот здесь должен применить один из цветов вышеуказанного функция

menubar=Menu(root)
filemenu=Menu(menubar, tearoff=0)
filemenu.add_command(label='Измените цвет окна', command=change_color)
menubar.add_cascade(label="Файл", menu=filemenu)

root.config(menu=menubar)
root.mainloop()


Возможно ли создавать и взаимодействовать с запароленными текстовыми файлами через Python?
Я пишу игру при помощи pygame, для сохранения стандартных настроек сложности и прогресса игрока я решил использовать текстовые файлы. Очевидно, если не поставить пароли на текстовики, игрок сможет их изменить и сжульничать. Моя игра, конечно не очень сложная(буквально сапёр) и читерить в ней нет особого смысла, но всё же хотелось бы не давать игроку возможности манипуляции с файлами. Отсюда вытекает вопрос: "Возможно ли создавать и взаимодействовать с запароленными текстовыми файлами через Python?"
Если возможно, то буду благодарен за пример реализации.

Как вам вариант зашифровать настройки?
<code>
import json
from cryptography.fernet import Fernet

###########################################
# создание ключа шифрования
###########################################

# генерим ключ шифрования
key = Fernet.generate_key()
# пишем в файл setting1.bin ключ шифрования
with open(r'C:\ВАШ_ПУТЬ\setting1.bin', 'wb') as file_key:
    file_key.write(bytes(key))

############################################
# шифруем настройки и записываем в файл
############################################

# считываем ключ шифрования из файла setting1.bin
with open(r'C:\ВАШ_ПУТЬ\setting1.bin', 'rb') as file_key:
    key = file_key.read()

# Используем считанный ключ шифрования
encrypt_key = Fernet(key)

# например есть словарь с настройками
u_settings = {'set1': 10, 'set2': 'any', 'set3': 20}
# переводим настройки в байты
u_settings_b = json.dumps(u_settings, indent=2).encode('utf8')
# шифруем настройки
u_settings_enc = encrypt_key.encrypt(u_settings_b)
# записываем в файл setting2.bin зашифрованные настройки
with open(r'C:\ВАШ_ПУТЬ\setting2.bin', 'wb') as file_enc:
    file_enc.write(u_settings_enc)

############################################
# читаем настройки из файла и дешифруем
############################################

# считываем ключ шифрования из файла setting1.bin
key = None
with open(r'C:\ВАШ_ПУТЬ\setting1.bin', 'rb') as file_key:
    key = file_key.read()
# Используем считанный ключ шифрования
encrypt_key = Fernet(key)
# переменная для хранения зашифрованных настроек
u_settings_enc = None
# читаем из файла setting2.bin зашифрованные настройки
with open(r'C:\ВАШ_ПУТЬ\setting2.bin', 'rb') as file_enc:
    u_settings_enc = file_enc.read()
# расшифровываем настройки в байтах
u_settings_b = encrypt_key.decrypt(u_settings_enc)
# переводим настройки в словарь
u_settings = json.loads(u_settings_b)
</code>


Как преобразовать строку в массив [дубликат]

На этот вопрос уже даны ответы здесь:

Как преобразовать строчное значение в список?

                                (3 ответа)

Закрыт 12 месяцев назад.

например пользователь ввёл
[1, 2, 3] в консоль
и как мне из этого сделать список.
пробовал так но не работает

array = []
exec("array = " + content)
# print(array)
if array[0] == 1:
   print(1)

после exec проверяю массив, а он пустой

Не понял зачем Вам
exec здесь нужен. Используете обычный парсинг.
Вариант 1. Через функции строки

text = '[1, 2, 3]'
parse = text.strip('[]').replace(' ', '').split(',')  # список из строковых значений, потом можно преобразовать в нужный формат

Вариант 2. Через библиотеку
json.

import json
text = '[1, 2, 3]'
parse = json.loads(text)

Вариант 3. Парсим через библиотеку re

parse = re.findall('([-+]?\d+)', text)  # Если в строке-списке будут только целые числа
parse = re.findall('([-+]?\d*\.\d+|\d+)', text)  # Если будут еще десятичные

Что у Вас получился список можно проверить функцией
type(parse), которая выдаст
<class 'list'>
В первом и третьем варианте на выходе будут списки из строк с числами. Их нужно будет преобразовать.


Возможно ли достать переменную и функции в классе? python
Мне нужно переменную из функции в классе первого файла перенести во второй файл. Как это можно сделать?
Пример 1 файла:

class get:
    def abc(self):
        if 1 == 1:
            a = 'text'
        else:
            pass

Пример 2 файла:

from main import *

get = get()
get.abc()
print(a)

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

Для получения значения полей объекта класса рекомендуется использовать геттеры.
Ваш вариант:

#main.py:

class get:
def abc(self):
    if 1 == 1:
        self.a = 'text'
    else:
        pass

#1.py:

from main import *
get = get()
get.abc()
print(get.a)

Альтернативный вариант:

#get.py:

class get:

def __init__(self):
    # установка а при инициализации
    self.a = self.__abc()

# геттер
def get_a(self):
    # какие-нибудь проверки
    return self.a

def __abc(self):
    if 1 == 1:
        return 'text'
    else:
        pass

#1.py:
from get import *

get = get()
a = get.get_a()
print(a)


Какие есть события у виджета Calendar в pyQT?
Какие есть события у виджета Calendar в pyQT?
По типу как у кнопок есть событие clicked()
Не могу нагуглить.

setDateRange() - Устанавливает нижнюю и верхнюю дату, доступную для выбора

setFirstDayOfWeek() - Определяет день первого столбца в календаре.
Предопределенные дневные константы:

Qt.Monday

Qt.Tuesday

Qt.Wednesday

Qt.Thursday

Qt.Friday

Qt.Saturday

Qt.Sunday

setMinimumDate() - Устанавливает минимальную дату для выбора

setMaximumDate() - Устанавливает максимальную дату для выбора

setSelectedDate() - Устанавливает объект QDate в качестве выбранной даты

showToday() - Показывает текущий месяц

selectedDate() - Возвращает выбранную дату

setGridvisible() - Включает или выключает календарную сетку

Вот ссылка на документацию.


Как сделать одинакову проверку одной и той же переменной класса в разных методах этого класса?
Использую Python 3. Есть класс, в котором есть какая-то переменная, которую обрабатывают несколько методов. Упрощенный пример:

class Foo:
def __init__(self, foobar):
    self.foobar = foobar

def bar_1(self):
    # some operation with self.foobar
    self.foobar = 'Another variable'

def bar_2(self):
    # some operation with self.foobar
    self.foobar = 'Another variable'

def bar_3(self):
    # some operation with self.foobar
    self.foobar = 'Another variable'

Я хочу, чтобы в результате вызова этих методов мне возвращался
raise или
return о том, что в этом вызове метода переменная
self.foobar никак не изменилась.

Есть, по-моему, очевидное и простое решение:

class Foo:
def __init__(self, foobar):
    self.foobar = foobar

def bar_1(self):
    old_foobar = self.foobar
    # some operation with self.foobar
    self.foobar = 'Another variable'
    if old_foobar == self.foobar:
        return 'Variable foobar has not changed'

def bar_2(self):
    old_foobar = self.foobar
    # some operation with self.foobar
    self.foobar = 'Another variable'
    if old_foobar == self.foobar:
        return 'Variable foobar has not changed'

def bar_3(self):
    old_foobar = self.foobar
    # some operation with self.foobar
    self.foobar = 'Another variable'
    if old_foobar == self.foobar:
        return 'Variable foobar has not changed'

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

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

def constants(func):
    def wraps(self_, *args, **kwargs):
        consts = dict(self_.__dict__)
        func(self_, *args, **kwargs)
        if all([v == self_.__dict__[c] for c, v in consts.items()]):
            print('No changes')
        else:
            print('Variables are changed')
    return wraps

class Foo:
    def __init__(self, foobar):
        self.foobar = foobar

    @constants
    def bar_1(self):
        # some operation with self.foobar
        self.foobar = 'Another variable'

    @constants
    def bar_2(self):
        # some operation with self.foobar
        self.foobar = 'Another variable'

    @constants
    def bar_3(self):
        # some operation with self.foobar
        self.foobar = 'Another variable'

f = Foo('123')
print(f.foobar)  # 123
f.bar_1()  # Variables are changed
print(f.foobar)  # Another variable
f.bar_2()  # No changes
print(f.foobar)  # Another variable
f.bar_3()  # No changes
print(f.foobar)  # Another variable


Задача 'Кузнечик' [закрыт]

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

 Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

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

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

Кузнечик прыгает по горизонтальной прямой. Если кузнечик находится в координате x, то он может прыгнуть либо вправо, либо влево на расстояние A, и оказаться либо в координате x+A, либо в координате x-A соответственно. В точке с координатой 0 находится высокий забор, через который кузнечик перепрыгнуть не может. Если какой-то особенно смелый кузнечик пытается перепрыгнуть его и оказаться в точке с отрицательными координатами, то он сталкивается с забором и остаётся в точке 0. Кузнечик оказался в точке с координатой P, а его дом находится в точке с координатой H. Помогите определить, сможет ли кузнечик добраться до своего дома и, если да, то какое минимальное количество прыжков ему придётся для этого сделать?
Мой код:
<code>
A,x,H=map(int,input().split())

deltaHome = H-x
if deltaHome % A == 0:
    stepsH = deltaHome // A
if x % A == 0:
    steps0 = x // A
</code>
Но работает неправильно, можете помочь пожалуйста?

Ну конечно, неправильно, ведь логики после
if deltaHome % A == 0 никакой нет.
Если нельзя напрямую допрыгать, тогда проверяем, находится ли дом на кратном A расстоянии от нуля. Если нет - всё, отпрыгался. Если да, то придётся сделать прыжки до нуля (округление вверх), потом до дома.

if deltaHome % A == 0:
    return deltaHome // A

if H % A == 0:
    return (x + A - 1) // A  +  H // A
else:
    return None


Как сохранить результат функции pprint в переменную?
Использую следующий код:

from pprint import pprint

a = {'fields' : [1 ,2 ,3 ,4]}
b = {'items' : [['a', 's', 'd', 'f'], ['s', 'a', 'd', 'f'], ['d', 's' ,'f', 'a']]}
a_and_b = [dict(zip(a['fields'], x)) for x in b['items']]
pprint (a_and_b, width=1)

На выходе получаю:

[{1: 'a',
  2: 's',
  3: 'd',
  4: 'f'},
 {1: 's',
  2: 'a',
  3: 'd',
  4: 'f'},
 {1: 'd',
  2: 's',
  3: 'f',
  4: 'a'}]

Все классно и здорово, но как мне сохранить результат функции pprint в переменную? (в файл очень не хотелось бы)
Если сделать следующее:

q = pprint(a_and_b, width=1)

функция отрабатывает и выводит данные в консоль (хотя по сути мне вывод в консоль не требуется, интересует только приведение результата в читаемый вид), но в дальнейшем
q = None

Вместо функции
pprint используйте
pformat:

from pprint import pformat

...

q = pformat(a_and_b, width=1)
print(q)

Я бы предложил еще вариант отобразить в
json:

import json

...

print(json.dumps(a_and_b, indent=4, ensure_ascii=False))


Как прописать в коде, что заданное число не должно быть кратно 100
Подскажите, пожалуйста, как прописать в коде следующее:
Заданное число должно быть кратно 4, но не кратно 100.

Оператор "%" показывает остаток при делении числа. Если остаток равен 0, то число кратно, если не равен нулю, то не кратно.
<code>
if number % 4 == 0 and number % 100 != 0:
    print('Число кратно 4 и не кратно 100.')
</code>


Изменить строки с адресами на Python
Пример адресов

г. Москва, пл. Спартаковская, д.  14 стр.  3 этаж / ком. / офис  2/9/108
г. Москва, ул. 14-Я Парковая, д.  8 офис  144
г. Москва, проезд Строительный, д.  7А корп.  28 этаж  2, ком. 223
г. Москва, ул. Фрязевская, д.  10 стр. 2 этаж  4 пом. XXI ком. 8
г. Москва, ул. Студенческая, д.  20 кв.  18
г. Москва, проспект Мира, д.  70 этаж  1А П III К 3 офис 10
г. Москва, пер. Луков, д.  4 этаж  ПОДВ пом. I ком. 8 РМ4Б
г. Москва, ул. Нагорная, д.  5 к.  4 этаж  1 ком. 11 офис 48
г. Москва, шоссе Энтузиастов, д.  56 стр.  32 пом.  329
г. Москва, ул. 3-Я Хорошёвская, д.  2 стр.  1 Э 3 П 21 К2 офис 5
г. Москва, набережная Бережковская, д.  20 стр.  5 пом.  I ком. 3
г. Москва, вн.тер.г. муниципальный округ Старое Крюково, г Зеленоград, к. 903, кв. 327

Из адресов мне нужно получить только город,название улицы, номер дома. Без этажей, офисов, квартир и т.п.
То есть

г. Москва, пл. Спартаковская, д.  14 стр.  3
г. Москва, ул. 14-Я Парковая, д.  8
г. Москва, проезд Строительный, д.  7А корп.  28
г. Москва, ул. Фрязевская, д.  10 стр. 2
г. Москва, ул. Студенческая, д.  20
г. Москва, проспект Мира, д.  70
г. Москва, пер. Луков, д.  4
г. Москва, проспект Рязанский, д.  86/1 стр.  1
г. Москва, проезд Электролитный, д.  1 корп.  3

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

Накидал тут немного, как это может быть

import csv
import re

# Данный паттерн ловит два вида значений
# или "д.  14 стр.  3" или "д.  14" или "д.  14 корп.  3"

pattern = r"д.\s+[А-Я0-9]+\s+корп.\s+\d+|д.\s+[А-Я0-9]+\s+стр.\s+\d+|д.\s+[А-Я0-9]+"

def usual_str(obj:str) -> str:
    """
    здесь на вход подаем строку откуда надо вытащить
    значение дома и строения, или только дома
    """
    k = re.search(pattern, obj).group()
    return k

with open("test.csv", encoding="utf-8") as csvfile:
    a = csv.reader(csvfile)
    for i in a:
        # здесь я проверяю длину набора данных
        # для основного массива данных длина равна 3
        # для других значений длин, например последняя строка
        # во входных данных, нужно писать отдельный обработчик
        if len(i) == 3:
            result = [i[0], i[1], usual_str(i[2])]
            print(','.join(result))

так вот это мы имеем на выходе:

г. Москва, пл. Спартаковская,д.  14 стр.  3
г. Москва, ул. 14-Я Парковая,д.  8
г. Москва, ул. Фрязевская,д.  10 стр. 2
г. Москва, ул. Студенческая,д.  20
г. Москва, проспект Мира,д.  70
г. Москва, пер. Луков,д.  4
г. Москва, ул. Нагорная,д.  5
г. Москва, шоссе Энтузиастов,д.  56 стр.  32
г. Москва, ул. 3-Я Хорошёвская,д.  2 корп.  1 # вот здесь я подставил корп.
г. Москва, набережная Бережковская,д.  20 стр.  5

Это не все готовое решение, но направление вам. Необходимо написать обработку для данных вырывающихся из общей массы, либо найти общее и отталкиваться от логики. Также,
re сейчас не ловит такие значения дома как
89/16. Тоже надо доработать


Перенос ключей в словарях на новую строку
На данный момент код следующий:

a = {'fields' : [1 ,2 ,3 ,4]}
b = {'items' : [['a', 's', 'd', 'f'], ['s', 'a', 'd', 'f'], ['d', 's' ,'f', 'a']]}

a_and_b = [dict(zip(a['fields'], x)) for x in b['items']]

print(a_and_b)

Результат:

[{1: 'a', 2: 's', 3: 'd', 4: 'f'}, {1: 's', 2: 'a', 3: 'd', 4: 'f'}, {1: 'd', 2: 's', 3: 'f', 4: 'a'}]

как мне из полученного результата в виде строки сделать красивые столбики:

[{1: 'a',
  2: 's',
  3: 'd',
  4: 'f'},

 {1: 's',
  2: 'a',
  3: 'd',
  4: 'f'},

 {1: 'd',
  2: 's',
  3: 'f',
  4: 'a'}

(P.S. в реальных данных которые получаю приходят 28 ключей на каждый словарь)

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

from pprint import pprint

a = {'fields' : [1 ,2 ,3 ,4]}
b = {'items' : [['a', 's', 'd', 'f'], ['s', 'a', 'd', 'f'], ['d', 's' ,'f', 'a']]}

a_and_b = [dict(zip(a['fields'], x)) for x in b['items']]

pprint(a_and_b, width=1)

Результат:

[{1: 'a',
  2: 's',
  3: 'd',
  4: 'f'},
 {1: 's',
  2: 'a',
  3: 'd',
  4: 'f'},
 {1: 'd',
  2: 's',
  3: 'f',
  4: 'a'}]

Параметр
width=1 нужен, чтобы
pprint максимально сузил вывод, без него вывод был бы таким (значение
width=80 по умолчанию, т.е.
pprint будет пытаться разбить текст на отдельные строки, если он шире 80 символов):

[{1: 'a', 2: 's', 3: 'd', 4: 'f'},
 {1: 's', 2: 'a', 3: 'd', 4: 'f'},
 {1: 'd', 2: 's', 3: 'f', 4: 'a'}]


Изучаю Python и застрял на kwargs
Доброго времени суток.
Изучаю  Python и застрял:

def tracklist(*artist,**tracks):
    for name in artist:
        print(name)
    for key, value in tracks.items():
        print(f"'ALBUM':{key}, 'TRACK':{value}")

tracklist(Woodkid={"The Golden Age": "Run Boy Run",
               "On the Other Side": "Samara"},
      Cure={"Disintegration": "Lovesong",
            "Wish": "Friday I'm in love"})

Функция должна распечатать значения из словаря в следующем виде:

Woodkid
ALBUM: The Golden Age TRACK: Run Boy Run
ALBUM: On the Other Side TRACK: Samara
Cure
ALBUM: Disintegration TRACK: Lovesong
ALBUM: Wish TRACK: Friday I'm in love

Где-то закралась ошибка, не могу найти

**tracks (
kwargs) это словарь из именованных параметров функции, у вас это будет
Woodkid и
Cure, а в
*artist попадут позиционные параметры, у вас их нет, т.к. только именованные передаете, поэтому в
artist (
args) будет пусто
С учетом выше написанного код поменял на:

def tracklist(**tracks):
    for name, tracks in tracks.items():
        print(name)
        for album, track in tracks.items():
            print(f"ALBUM: {album}, TRACK: {track}")

tracklist(
    Woodkid={"The Golden Age": "Run Boy Run", "On the Other Side": "Samara"},
    Cure={"Disintegration": "Lovesong", "Wish": "Friday I'm in love"}
)

Результат:

Woodkid
ALBUM: The Golden Age, TRACK: Run Boy Run
ALBUM: On the Other Side, TRACK: Samara
Cure
ALBUM: Disintegration, TRACK: Lovesong
ALBUM: Wish, TRACK: Friday I'm in love


Телеграм бот на Python - как реализовать одновременное общение с разными пользователями
Создаю бот с такой логикой:

бот задает пользователю несколько вопросов
записывает ответ в единое текстовое сообщение
пересылает мне сообщение в отдельный чат в телеграм

Проблема:
при одновременных ответах нескольких пользователей, информация перемешивается. Те может быть ответ на вопрос 1 пользователя, потом сразу другого, ответ на вопрос 2 первого и тд.

bot = telebot.TeleBot(TOKEN)
def klava(kuda, n_knopok, name_knopok, name_calldata, opisanie):
        keyboard = types.InlineKeyboardMarkup()
        for i in range(n_knopok):
           i_button = types.InlineKeyboardButton(text=name_knopok[i],
 callback_data=name_calldata[i])
           keyboard.add(i_button)
        bot.send_message(kuda, opisanie,reply_markup=keyboard)
infa = 'Анкета_'
@bot.message_handler(commands=['start'])
def send_welcome(message):
    klava(message.chat.id, 2, ['Дальше', 'Не актуально'], ['next', 'stop'], 'текст вступление.')
@bot.callback_query_handler(func=lambda call:call.data in ['next', 'stop'] )
def callback_worker(call):
      if call.data =='next':
        bot.send_message(call.message.chat.id, 'Напиши, пожалуйста, свое имя и ник в телеграм')
        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text='текст вступление')
      elif call.data =='stop':
        bot.send_message(call.message.chat.id, 'Мне очень жаль. Возвращайся, когда будет время. Мы будем очень рады. Отличного дня!')
@bot.message_handler(content_types=['document'])
def get_document_messages(message):
    global TOKEN
    forward_message (TOKEN, ссылка на канал, message.chat.id, message.id)
i=1
@bot.message_handler(content_types=['text'])
def get_text_messages(message):
       global infa
       global  i
       infa = infa + '_' +message.text
       if message.text != 0 :
          klava(message.chat.id, 1, ['Дальше'], [i], 'Убедись, что ответил/ла на вопрос и перейдем дальше')
          return i
@bot.callback_query_handler(func=lambda call: call.data in ['1', '2', '3','4'])
def callback_worker(call):
      global i
      text =['вопрос 1', 'вопрос 2', 'вопрос 3']
      bot.edit_message_text(chat_id=call.message.chat.id,
 message_id=call.message.message_id, text='Убедись, что ответил/ла на вопрос и перейдем дальше')
      if i<4:
        bot.send_message(call.message.chat.id, text[i-1])
      else:
        klava(call.message.chat.id, 3, ['вар1', 'вар2', 'вар3'], ['вар1', 'вар2', 'вар3'], 'вопрос 4')
        i=0
      i = i+1

и тд. другие вопросы
последний вопрос:

def callback_worker(call):
      if call.data == 'ответ1':
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text='Записал твой ответ')
            global infa
            bot.send_message(call.message.chat.id,'ответ на анкету')
            bot.send_message(ссылка на чат, infa)
            infa = 'Анкета_'
      elif call.data == 'ответ2':
             bot.send_message(call.message.chat.id,'негативный ответ')
             infa = infa + 'не подходит'
             bot.send_message(ссылка на чат, infa)
             infa = 'Анкета_'
bot.polling(none_stop=True)

Один из вариантов решения создать базу данных, где для каждого user'a будет своя запись и прогресс общения хранить в такой бд по user id. Рекомендую SQLAlchemy


Как генерировать такую ссылку?
На многих сайтах ссылки на посты выглядят примерно так "rabota-so-staticheskimi-fajlami-vo-flask" или "lunnoe-puteshestvie-privedet-k-novomu-miru" вопрос заключается в том как генерировать такую ссылку?

Обычной заменой по словарю можно обойтись:

TRANSLIT = {'а':'a','б':'b','в':'v','г':'g','д':'d','е':'e','ё':'yo',
      'ж':'zh','з':'z','и':'i','й':'i','к':'k','л':'l','м':'m','н':'n',
      'о':'o','п':'p','р':'r','с':'s','т':'t','у':'u','ф':'f','х':'h',
      'ц':'c','ч':'ch','ш':'sh','щ':'sch','ъ':'','ы':'y','ь':'','э':'e',
      'ю':'u','я':'ya', 'А':'A','Б':'B','В':'V','Г':'G','Д':'D','Е':'E','Ё':'YO',
      'Ж':'ZH','З':'Z','И':'I','Й':'I','К':'K','Л':'L','М':'M','Н':'N',
      'О':'O','П':'P','Р':'R','С':'S','Т':'T','У':'U','Ф':'F','Х':'H',
      'Ц':'C','Ч':'CH','Ш':'SH','Щ':'SCH','Ъ':'','Ы':'y','Ь':'','Э':'E',
      'Ю':'U','Я':'YA',' ': '-'}

def translit(text: str, lower=True):
    text = text.lower() if lower else text
    return ''.join([TRANSLIT[s] if s in TRANSLIT else s for s in text])

print(translit('История одного дома'))
print(translit('Он сказал Astalavista'))

Второй вариант через встроенную функцию
translate(), которая переводит, и
maketrans(), которая строит таблицу перевода по словарю.

def translit(text: str, lower=True):
    text_table = text.maketrans(TRANSLIT)
    return text.translate(text_table).lower() if lower else text.translate(text_table)

Вывод:

istoriya-odnogo-doma
on-skazal-astalavista


Как сделать так чтобы код после input() работал, даже если ничего ещё не ввели, но когда ввели, вызвать функцию(python)
Как сделать так чтобы код после input() работал, даже если ничего ещё не ввели, но когда ввели, вызвать функцию(python)

Можно так:
<code>
import threading
from time import sleep

def print_result(result):
   print('I have a message for you ' + result)

def wait_for_input(callback):
   value = input('give me> ')
   callback(value)

thread = threading.Thread(target=wait_for_input, args=(print_result,))
thread.start()

counter = 1

while thread.is_alive():
   counter += 1
   sleep(1)

print("I was busy and counted to {}".format(counter))
</code>


pandas, unix timestamp to datetime python
считываю csv файл, первая колонка идет unix timestamp есть ли способ быстро преобразовать дату в нормальный формат ? желательно сохранив в том же df. Еще вопрос по той же теме: данные другого столбца являются цифрами в строковом представлении, есть ли тут способ поменять формат для вывода на график (matplotlib)?
пример
<code>
df = pd.DataFrame({0: [1586390400000,1586383200000,1586379600000], 1: ['123', '321', '345']})
</code>


Увеличение потребления памяти PyPy со временем
Есть бот для ВК. Код достаточно велик, так что даже упрощенную часть показать не смогу. Проблема в том, что со временем при запуске на PyPy он начинает кушать большие объемы памяти: сначала 100мб, затем через 10-15 минут - 150мб. После этого скорость возрастания сбавляется, но не пропадает: спустя пару дней можно увидеть и 300мб. Бота, если что, запускаю через службы Linux (systemctl) и там же проверяю память (systemctl status ...).
Увеличение потребляемой памяти в самом начале, как я понял, для PyPy норма, но вот постоянное увеличение со временем - уже нет. Единственное, что у меня может кушать память, это словарик, хранящий в себе некоторые кешированные данные, которые возвращаются через copy.copy(). Тем не менее, этот самый словарик очищается каждые n-минут (dict.clear()), да и плюсом порой прогоняется ручной сборщик мусора (gc.collect()).
Что еще можно попробовать предпринять?

Если программа живёт долгие дни, то можно настроить перезапуск – это традиционный костыль для утечек памяти.
Можно дополнить конфиг файл
systemd для перезапуска каждые сутки таким образом:

[Service]
Type=notify
WatchdogSec=86400
Restart=always


beautifulsoup select, передача формата текст
Есть код

mathes = soup.find_all('div', class_='_3Sdru5UgY8N5jF729-bJHD')
for math in mathes:
    time = math.find('span', class_='_1rkQUAonwe5irynMAgt2u1').get_text(strip=True)
    goals = math.select('div._2cD5vzrU7r3ToIHzBKjD0W')
    link = math.find('a', class_='_1nO2YxHrIZ_7_iPU4qsbyU').get('href')
    print(time, goals , URL + f'{link}')

который выводит строки по типу
2-й тайм 60' [<div class="_2cD5vzrU7r3ToIHzBKjD0W">0</div>, <div class="_2cD5vzrU7r3ToIHzBKjD0W">0</div>]
Смысл в том, чтобы переменная goals, выводилась в качестве текста. Например:
2-й тайм 60' 0 0
Как добавить пробелы это понятно, а как передать переменной goals формат текста?

Собрать текст из списка в
goals, а после все это вывести в форматированной строке:

goals_text = ' '.join(x.text for x in goals)
print(f'{time} {goals_text} {URL}{link}')


Пишу адресную книгу. Представленная ниже функция должна изменять адрес и после этого завершать цикл while. Но почему оператор break не работает?
<code>
def change():
    while True:
        ch = input('\tВведите имя контакта чей адресс вы хотите изменить:\n')
        if ch == '':
            print('вы ничего не ввели')

        for c, v in ab.items():
            if c == ch:
                new_address = input('Введите новый адресс:\n')
                ab[c] = new_address
                print('Адресс успешно изменен')
                break
</code>

С помощью
break можно прервать только самый внутренний цикл. Вам нужно поменять "вечный" цикл
while на цикл по булевой переменной. Примерно так:

def change():
    is_input_mode = True # <--
    while is_input_mode: # <--
        ch = input('\tВведите имя контакта чей адресс вы хотите изменить:\n')
        if ch == '':
            print('вы ничего не ввели')

        for c, v in ab.items():
            if c == ch:
                new_address = input('Введите новый адресс:\n')
                ab[c] = new_address
                print('Адресс успешно изменен')
                is_input_mode = False # <--
                break


Реализация оплаты в телеграмм боте
Необходимо реализовать оплату в телеграмм боте, что для этого необходимо и какая платёжная система или сервис приёма платежей подойдёт без открытия ООО/ИП.

В Telegram имеется встроенный метод платежей.

Платёжные боты существуют в Telegram с 2017 года. С их помощью можно
безопасно оплачивать товары и услуги вроде доставки пиццы, не покидая
приложения.
Для оплаты можно использовать любое приложение – в том числе Telegram
для компьютеров. Покупатель также может оставить чаевые, чтобы
поддержать любимого автора, кафе или магазин.
Платформа для платежей открытая и бесплатная – Telegram не берёт
комиссии и не хранит платежную информацию. Реквизиты отправляются
напрямую платежной системе, а адрес для доставки — продавцу, чтобы он
мог отправить товар.

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

Stripe
YooMoney (ЮSelf - бесплатный сервис для самозанятых)
Sberbank
Tranzzo
Payme
CLICK
LiqPay
ECOMMPAY
PayMaster

Для подключения оплаты:

у @BotFather выберите своего бота
Перейдите в раздел Payments
Выберите платёжного провайдера
Для разработки и отладки выберите Connect *** TEST
Для "боевой" среды выберите Connetct *** LIVE

Описание пошагового процесса оплаты
Описание API
Пример реализации с помощью pyTelegramBotAPI
Пример реализации с помощью Telethon


Таймер текста как реализовать
Как добавить таймер? Чтобы после ввода 'получить текст' появляется текст - print('text') через 1-3 секунды? Идей нету, так как опыта должного нет. Вот сам код
<code>

    a = input()
    if a.lower() == 'получить текст':
        print('text')
        b = input()
        if b.lower() == 'получить инфо':
            print('info')
        else:
            print('error')
    else:
        print('error')

    >>> получить текст
    text
    получить инфо
    info
</code>

import time

a = input()
if a.lower() == 'получить текст':
    time.sleep(3)
    print('text')
    ...


Как сделать из 2 списков словарь?
У меня есть 2 словаря со значениями:
1)

a =  {'fields' : [1 ,2 ,3 ,4]}

b =  {'items' : [a, s, d, f], [s, a, d, f], [d, s ,f, a] и тд}

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

{'1': a, '2': s, '3': 4, '4': f},
{'1': s, '2': a, '3': d, '4': f},
{'1': d, '2': s, '3': f, '4': a}

Крайняя попытка потерпела неудачу на следующем решении:

a_and_b = dict(zip(a, b))
print (a_and_b)

Получается так:

{
  '1': [a, s, d, f],
  '2': [s, a, d, f],
  '3': [d, s ,f, a],
   # и так далее
}

Помогите пожалуйста, буду крайне благодарен


Как запустить одновременно два бесконечных процесса ? (FastAPI)
Вобщем я учусь писать тесты и хочу для тестовых нужд, чтобы тест сам запускал сервер uvicorn и ещё один сервер, который запускается из определённой папки командой npm start.
Видимо в синхронном коде это сделать не получится, т.к. uvicorn.run() собственно как и другой сервер, который запускается через npm start  - это процессы бесконечные и как я их местами не менял, запускается всегда один, а до второго дело не доходит.
Подскажите, пожалуйста, может быть можно как-то запустить каждую команду в отдельном процессе?
Спасибо!
Мой код:
<code>
import uvicorn
import subprocess

if __name__ == '__main__':
    uvicorn.run(
        'main:app',
        reload=True,
        port=7777
    )
    subprocess.run('cd ~/Desktop/randomfolder && npm start', shell=True)
</code>

Я бы рассмотрел использование supervisord.
Устанавливаете его в virtualenv
pip install supervisor и создаете файл конфигурации supervisord.conf типа:

[program:uvicorn]
command=uvicorn main:app --port 7777

[program:npm]
command=npm start
directory=~/Desktop/randomfolder

Стартуете
supervisord один раз, и потом запускаете все командой:

supervisorctl start all

Еще он понимает команды
stop,
restart,
status и другие. Умеет перестартовывать приложения если они рухнули и много других полезностей.


Динамическое создание классов на python
Необходимо реализовать ядро СУБД, работающее по принципу ORM. Интерфейс-класс-БД. Соответственно, необходимо создавать экземпляры класса для каждой записи БД. Как это организовать?

Стало любопытно и накидал простенький ORM. Но это именно пример, т.к. всего 2 типа поддерживается int и str, у полей нет всяких флагов типа уникальности или значения по умолчанию. Нет и связи между таблицами
Пока писал думал о
peewee, поэтому сделал базовую модель с
Meta классом
Пример:

import sqlite3

from dataclasses import dataclass
from typing import List

con = sqlite3.connect('test.sqlite')
con.row_factory = sqlite3.Row  # Чтобы получать из SELECT элементы как словари

class BaseModel:
    class Meta:
        db: sqlite3.Connection = con

    @classmethod
    def create_table(cls):
        con = cls.Meta.db

        fields = [f'{f.name} {"INTEGER" if f.type == int else "TEXT"}' for f in cls.__dataclass_fields__.values()]
        sql = f"CREATE TABLE IF NOT EXISTS {cls.__name__} ({', '.join(fields)})"
        print(f'[SQL]: {sql}')

        con.execute(sql)
        con.commit()

    def insert_db(self):
        self.create_table()

        cls = self.__class__
        con = cls.Meta.db

        fields = list(cls.__dataclass_fields__)
        values = [getattr(self, f) for f in fields]
        placeholders = ['?'] * len(fields)

        sql = f"INSERT INTO {cls.__name__} ({', '.join(fields)}) VALUES ({', '.join(placeholders)})"
        print(f'[SQL]: {sql}', values)

        con.execute(sql, values)
        con.commit()

    @classmethod
    def select_db(cls) -> List['BaseModel']:
        cls.create_table()
        con = cls.Meta.db

        sql = f"SELECT * FROM {cls.__name__}"
        print(f'[SQL]: {sql}')

        return [cls(**dict(row)) for row in con.execute(sql).fetchall()]

@dataclass
class Foo(BaseModel):
    name: str
    value: int

Foo(name='foo', value=123).insert_db()
print(Foo.select_db())

print()

Foo(name='bar', value=456).insert_db()
print(Foo.select_db())

Результат:

[SQL]: CREATE TABLE IF NOT EXISTS Foo (name TEXT, value INTEGER)
[SQL]: INSERT INTO Foo (name, value) VALUES (?, ?) ['foo', 123]
[SQL]: CREATE TABLE IF NOT EXISTS Foo (name TEXT, value INTEGER)
[SQL]: SELECT * FROM Foo
[Foo(name='foo', value=123)]

[SQL]: CREATE TABLE IF NOT EXISTS Foo (name TEXT, value INTEGER)
[SQL]: INSERT INTO Foo (name, value) VALUES (?, ?) ['bar', 456]
[SQL]: CREATE TABLE IF NOT EXISTS Foo (name TEXT, value INTEGER)
[SQL]: SELECT * FROM Foo
[Foo(name='foo', value=123), Foo(name='bar', value=456)]


Ошибка "TypeError: '>' not supported between instances of 'int' and 'str'"
написал вот такой код:

a = int(input ("::: "))

if a > "80":
    print("too much")

elif a < "5":
    print ("too little")

else:
    print("started")

но он выдает ошибку
"TypeError: '>' not supported between instances of 'int' and 'str'"  из ошибки понятно что не существует метода > для int но как это исправить я не знаю

Убери кавычки из чисел, вот и все:
<code>
a = int(input ("::: "))

if a > 80:
    print("too much")

elif a < 5:
    print ("too little")

else:
    print("started")
</code>


Python multiprocessing, не передается значение переменной из одной функции в другую
Пытаюсь разобраться с мультипроцессингом, но никак не пойму как правильно его использовать в моем случае, может кто подскажет.
Итак, есть 3 функции:
stream,
print_sound - прослушка микрофона и детектор громкости, если громкость есть то она суммируется и
one которая печатает все время сумму громкости, вот только  она не печатает, вывод идет все время 0, хотя если принт написать в
print_sound, то все нормально суммируется и выводится.
Подскажите, почему так, и как пофиксить?
PS: изучаю python месяц
Код ниже:

import sounddevice as sd
import numpy as np
import keyboard
import time as t
import pyautogui
import multiprocessing

r=0
rr = 0

def one():
    try:
        while True:
            print(rr)

    except KeyboardInterrupt:
        print('1')

def stream():
    global st
    with sd.Stream(callback=print_sound):
        sd.sleep(1000000)

def print_sound(indata, outdata, frames, time, status):
    global rr
    volume_norm = np.linalg.norm(indata)*10
    r = int(volume_norm)
    rr = rr+r

if __name__ == '__main__':
    p1 = multiprocessing.Process(target=stream)
    p3 = multiprocessing.Process(target=one)
    p1.start()
    p3.start()
    p1.join()
    p3.join()

У каждого процесса - своя память. Это означает, что у каждого процесса своя копия переменной
rr. Когда один процесс ее модифицирует (у себя в памяти), другой этого не видит, он видит то значение, которое переменная получила в момент запуска (при старте процесса идет загрузка модулей и переменные получают начальные значения) или работы процесса.
Для того, чтоб можно было обмениваться данными между процессами, нужно использовать специальные механизмы межпроцессного взаимодействия, представленные утилитами из модуля
multiprocessing.
Managers
Менеджеры позволяют создавать переменные, которые разделяются между процессами. Поддерживаются:

просто значение -
Manager.Value
словарь
Manager.dict
список
Manager.list
и др.

Если говорить грубо и упрощенно, то при изменении переменной менеджер заботится о том, чтоб значение синхронизировалось с другими процессами.
Пример использования
Manager.Value:

from time import sleep
import multiprocessing

def watcher(var):
    while True:
        print(f'watcher: {var.value}')
        sleep(0.3)

def modifier(var):
    for i in range(5):
        var.value += 1
        print(f'modifier: modified {var.value}')
        sleep(1)
    print(f'modifier: done')

if __name__ == '__main__':
    manager = multiprocessing.Manager()
    var = manager.Value('var', 0)
    p1 = multiprocessing.Process(target=modifier, args=(var,))
    p2 = multiprocessing.Process(target=watcher, daemon=True, args=(var,))
    p1.start()
    p2.start()
    p1.join()

Очереди и каналы
Позволяют посылать однонаправленный (Queue) и двунаправленные (Pipe) потоки данных между процессами.
Пример использования
multiprocessing.Queue:

from time import sleep
from multiprocessing import Process, Queue

def producer(queue):
    for i in range(1, 5):
        queue.put(i)
        print(f"producer: put {i}")
        sleep(1)
    queue.put(None)  # посылаем сигнал окончания
    print("producer: done")

def consumer(queue):
    while True:
        item = queue.get()
        if item is None:
            break
        print(f"consumer: get {item}")
    print("consumer: done")

if __name__ == '__main__':
    queue = Queue()
    p1 = Process(target=producer, args=(queue,))
    p2 = Process(target=consumer, daemon=True, args=(queue,))
    p1.start()
    p2.start()
    p1.join()
    print("main: done")

Пример использования
multiprocess.Pipe:

from time import sleep
from multiprocessing import Process, Pipe

def ping_pong(name, pipe, initiate):
    if initiate:
        print(f'{name}: sent 1')
        pipe.send(1)
    while True:
        val = pipe.recv()
        print(f'{name}: received {val}')
        if val > 5:
            break
        val += 1
        sleep(1)
        pipe.send(val)
        print(f'{name}: sent {val}')
    print(f"{name}: done")

if __name__ == '__main__':
    end1, end2 = Pipe()
    p1 = Process(target=ping_pong, daemon=True, args=('ping', end1, True))
    p2 = Process(target=ping_pong, daemon=True, args=('pong', end2, False))
    p1.start()
    p2.start()
    while p1.is_alive() and p2.is_alive():
        sleep(1)
    print("main: done")

Решение для задачи из вопроса
Для решение задачи из вопроса удобно поспользоваться
Manager.Value:

import multiprocessing
from functools import partial

def one(rr):
    while True:
        print(rr.value)

def stream(rr):
    global st
    with sd.Stream(callback=partial(print_sound, rr)):
        sd.sleep(1000000)

def print_sound(rr, indata, outdata, frames, time, status):
    volume_norm = np.linalg.norm(indata)*10
    r = int(volume_norm)
    rr.value += r

if __name__ == '__main__':
    manager = multiprocessing.Manager()
    rr = manager.Value('rr', 0)
    p1 = multiprocessing.Process(target=stream, args=(rr,))
    p3 = multiprocessing.Process(target=one, args=(rr,))
    # ... тут все как раньше


Создать словарь со словарями из txt файла
Есть текстовый файл с рецептами, например:

Омлет
3 # показывает кол-во ингредиентов в блюде
Яйцо | 2 | шт
Молоко | 100 | мл
Помидор | 2 | шт
Утка по-пекински
4
Утка | 1 | шт
Вода | 2 | л
Мед | 3 | ст.л
Соевый соус | 60 | мл
Запеченный картофель
3
Картофель | 1 | кг
Чеснок | 3 | зубч
Сыр гауда | 100 | г
Фахитос
5
Говядина | 500 | г
Перец сладкий | 1 | шт
Лаваш | 2 | шт
Винный уксус | 1 | ст.л
Помидор | 2 | шт

Из этого нужно сделать словарь со словарями такого вида:

cook_book = {
  'Омлет': [
    {'ingredient_name': 'Яйцо', 'quantity': 2, 'measure': 'шт.'},
    {'ingredient_name': 'Молоко', 'quantity': 100, 'measure': 'мл'},
    {'ingredient_name': 'Помидор', 'quantity': 2, 'measure': 'шт'}
    ],
  'Утка по-пекински': [
    {'ingredient_name': 'Утка', 'quantity': 1, 'measure': 'шт'},
    {'ingredient_name': 'Вода', 'quantity': 2, 'measure': 'л'},
    {'ingredient_name': 'Мед', 'quantity': 3, 'measure': 'ст.л'},
    {'ingredient_name': 'Соевый соус', 'quantity': 60, 'measure': 'мл'}
    ],
  'Запеченный картофель': [
    {'ingredient_name': 'Картофель', 'quantity': 1, 'measure': 'кг'},
    {'ingredient_name': 'Чеснок', 'quantity': 3, 'measure': 'зубч'},
    {'ingredient_name': 'Сыр гауда', 'quantity': 100, 'measure': 'г'},
    ]
}

Пока что то такое получается:

with open("recipes.txt", encoding='utf-8') as f:
     d = {i.split(" ")[0]: " ".join(i.replace("\n", "").split(" ")[1:]) for i in f}
print(d)

Можно читать файл и разбирать строки используя примитивный FSM (конечный автомат):
<code>
ST_TITLE = 1
ST_COUNT = 2
ST_INGREDIENTS = 3

cook_book = {}
state = ST_TITLE
with open("78.txt", encoding='utf-8') as f:
    for line in f:
        line = line.strip()
        if not line: continue
        if state == ST_TITLE:
            title = line
            cook_book[title] = []
            state = ST_COUNT
        elif state == ST_COUNT:
            count = int(line)
            state = ST_INGREDIENTS
        else: # if state == ST_INGREDIENTS:
            data = [x.strip() for x in line.split('|')]
            data[1] = int(data[1])
            cook_book[title].append(dict(zip(('ingredient_name', 'quantity', 'measure'), data)))
            count -= 1
            if count == 0:
                state = ST_TITLE

print(cook_book)
</code>


Копирование из текста файла в другой файл python [закрыт]

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

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

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

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

У меня есть папка с текстовыми файлами, мне нужно что-бы python скопировал 2-ую строчку каждого файла и ввёл её в итоговый текстовый файл. Кто может помочь?

Подправьте по свои нужды :)
<code>
# Модуль для работы с файловой системой
import os

# Получение текущей директории
start_dir = os.getcwd()
# Получение списка файлов в текущей директории
files = os.listdir(start_dir)
# Фильтрование по расширению текстовых файлов
txt = filter(lambda f: f.endswith(".txt"), files)

# Новый файл (со вторыми строчками)
new_file = open("new_file.txt", "w")

# Прохож по списку из текстовых файлов, лежащих в текущей директории
for t in txt:
    # Открытие очередного файла в режиме чтения
    old_file = open(t, "r")
    # Чтение первой строки (пропуск, так как никуда не записываем)
    old_file.readline()
    # Запись второй строки
    new_file.write(old_file.readline())
    # Безопасное закрытие очередного файла
    old_file.close()

# Безопасное закрытие нового файла (со вторыми строчками)
new_file.close()
</code>


Semantic-UI Modal
Просьба подсказать, как правильно работать с модальными окнами
Semantic UI
имею следующий код:

$('#table tbody').on( 'click', 'i', function () {
            var data = empDataTable.row( $(this).parents('tr') ).data();
            console.log(data['id']);
            $.ajax({
                url: '/show_by_id',
                type: 'post',
                data: {id: data['id']},
                success: function(data){
                    // $('.modal-body').html(data);
                    $('.modal-body').append(data.htmlresponse);
                    $('#alaris_id').modal({
                        transition: 'vertical flip',
                        blurring: true
                    }).modal('show');
                }
            });
        } );

<div class="ui modal" id="id">
    <div class="modal-body"></div>
</div>

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

У Вас есть закомментированная строка с правильным решением.
.append() добавляет результат в конец, а если там уже что-то есть, то к предыдущему добавится следующее.
.html() заменяет содержимое элемента представленным кодом.
Поэтому вместо:

$('.modal-body').append(data.htmlresponse);

напишите:

$('.modal-body').html(data.htmlresponse);

и тогда всё будет заменяться как надо.


Как получить нужные значения?
Есть код

soup = BeautifulSoup(map, 'lxml')
items = soup.find_all('div', class_='map-icon house-for-sale')

выводит строки по типу:

<div class="map-icon house-for-sale" data-html="true" data-original-title="&lt;div class='text-center'&gt;№ 98&lt;br&gt;&lt;br&gt;Стоимость: 400000 $&lt;/div&gt;" data-toggle="tooltip" style="top:947.992px;left:1074.047px;background:url(/images/house_1.gif)" title=""></div>

Пытался

for x in items:
    s = x.find('div', class_='text-center')

Но ничего не находит. Суть в том, чтобы получить значения '№' и 'Стоимость'.
Как это можно реализовать?

Значение, что вы хотите вытащить увидел в атрибуте data-original-title. Оно там как кусок html хранится.
Поэтому, чтобы его извлечь как текст, нужно его распарсить:

from bs4 import BeautifulSoup

html = """
<div class="map-icon house-for-sale" data-html="true" data-original-title="&lt;div class='text-center'&gt;№ 98&lt;br&gt;&lt;br&gt;Стоимость: 400000 $&lt;/div&gt;" data-toggle="tooltip" style="top:947.992px;left:1074.047px;background:url(/images/house_1.gif)" title=""></div>
<div class="map-icon house-for-sale" data-html="true" data-original-title="&lt;div class='text-center'&gt;№ 98&lt;br&gt;&lt;br&gt;Стоимость: 500000 $&lt;/div&gt;" data-toggle="tooltip" style="top:947.992px;left:1074.047px;background:url(/images/house_1.gif)" title=""></div>
<div class="map-icon house-for-sale" data-html="true" data-original-title="&lt;div class='text-center'&gt;№ 98&lt;br&gt;&lt;br&gt;Стоимость: 600000 $&lt;/div&gt;" data-toggle="tooltip" style="top:947.992px;left:1074.047px;background:url(/images/house_1.gif)" title=""></div>
"""

soup = BeautifulSoup(html, 'lxml')
items = soup.find_all('div', class_='map-icon house-for-sale')

for x in items:
    data_original_title = x['data-original-title']
    print(data_original_title)

    title_el = BeautifulSoup(data_original_title, 'lxml')
    print(title_el.get_text(strip=True, separator='\n'))

    print()

Результат:

<div class='text-center'>№ 98<br><br>Стоимость: 400000 $</div>
№ 98
Стоимость: 400000 $

<div class='text-center'>№ 98<br><br>Стоимость: 500000 $</div>
№ 98
Стоимость: 500000 $

<div class='text-center'>№ 98<br><br>Стоимость: 600000 $</div>
№ 98
Стоимость: 600000 $


Наложение зацикленной Gif-анимации с прозрачным фоном на видео
Я работаю с библиотекой MoviePy на языке Python, которая является обёрткой над ffmpeg и некоторыми чисто питоньими библиотеками. Мне нужно наложить на видео в формате mp4 гиф-анимацию с прозрачным фоном - посередине сверху. При этом анимация (её длительность - до 10 сек.) должна быть зациклена на протяжении всего видео. Самое главное, чтобы через прозрачный фон Gif было видно видео.
Подскажите, пожалуйста, как этого можно реализовать, используя MoviePy, если нет - то какими средствами этого можно достичь. (И есть ли у чистой ffmpeg такая возможность?)
Прошу меня простить за возможную неграмотность. Заранее спасибо.
//Правка.
Всё получилось сделать с помощью MoviePy
Но... Теперь возникли другие две проблемы.

Видео рендерится слишком долго. Трёхминутный ролик обрабатывался почти столько же, как длится сам ролик. Приемлемая же скорость рендеринга для меня составляет минимум 1/3 от длительности самого ролика.
Gif кодирует всего  256 цветов. На фоне Full-Hd видео это смотрится не очень. Значит, нужно накладывать видео на видео.

Наложение gif-анимации c поддержкой бинарной прозрачности можно реализовать средствами MoviePy. Код с комментариями прилагаю
<code>
from moviepy.editor import VideoFileClip, CompositeVideoClip

clip = VideoFileClip('video.mp4')
#watermark = VideoFileClip("./image.gif")
watermark = (VideoFileClip(r"image.gif", has_mask=True)
                     .loop()  # loop gif
                     .set_duration(clip.duration)  # Продолжительность водяного знака
                     .resize(height=50)  # Высота водяного знака будет пропорционально масштабирована.
                     .margin(left=8, top=8, opacity=0)  # Поля водяных знаков и прозрачность
                     .set_pos(("left", "top")))  # Расположение водяного знака

watermark_video = CompositeVideoClip([clip, watermark])
watermark_video.write_videofile('output.mp4')
</code>


Как поменять значение в составном списке
<code>
a = [('123',), ('456',), [['12313', '2662'], ['52525', ['4234', ['009999']]]]],[('45235626t2',)]

for i in a:
    for k in i:
        for y in k:
            if y == '123':
                new = y.replace(y, '000')
                a[0][0] = new
</code>
Хочу поменять ('123',) на ('000',) но при этом вообще меняется вся структура списка, как поменять так чтоб поменялось только '123' в кортеже?

И так. Можно пойти многими путями, к примеру, самый относительно простой и чуть более сложный.
Вариант с помощью рекурсии обойти список и поменять значения:

def list_replace(lst: list, value_search, value_replace):
    res = []
    for item in lst:  # Итерируем входной список
        if isinstance(item, (list, set, tuple)):
            res.append(list_replace(item, value_search, value_replace))  # На этом уровне уходим в список, сет, кортеж глубже
        else:
            res.append(item if item != value_search else value_replace)  # добавляем значение в результирующий список, если совпадает с искомым значением, то меняем его
    return type(lst)(res)

a_repl = list_replace(a, '123', '000')

Через библиотеку
json с помощью
json.dumps() дампим
а в строку. В строке делаем замену через
replace(). Дальше с помощью
json.loads() грузим обратно в переменную.

import json

a = [[('123',), ('456',), [['12313', '2662'], ['52525', ['4234', ['009999']]]]],[('45235626t2',)]]
a_dump = json.dumps(a)
a_replace = a_dump.replace('"123"', '"000"')  # если убрать двойные кавычки внутри, то поменяет все строки, в которых есть 123
a_from_json = json.loads(a_replace)

Вывод:

# список а-исходный
[[('123',), ('456',), [['12313', '2662'], ['52525', ['4234', ['009999']]]]], [('45235626t2',)]]
# список после json
[[['000'], ['456'], [['12313', '2662'], ['52525', ['4234', ['009999']]]]], [['45235626t2']]]
# список после рекурсии
[[('000',), ('456',), [['12313', '2662'], ['52525', ['4234', ['009999']]]]], [('45235626t2',)]]

Если у нас переменная
а кортеж, то с ним тоже вариант с рекурсией работает:

a = [('123',), ('456',), [['12313', '2662'], ['52525', ['4234', ['009999']]]]],[('45235626t2',)]

Вывод:

([('000',), ('456',), [['12313', '2662'], ['52525', ['4234', ['009999']]]]], [('45235626t2',)])


Выполнение Python скрипта из другого Python скрипта с визуальной составляющей
Сначала вводные данные:
Есть 6 Python скриптов каждый из них в данный момент запускает по строгой необходимости через терминал, 4 из них не требуют общения с пользователем, просто тихо-мирно выполняют парочку не сложных задач. И есть 2 скрипта которые генерируют условный конфиг файл, но при генерации он задает вопросы и на них надо отвечать. Грубо говоря "Укажите адрес действующего сервера MongoDB" в терминале необходимо ввести эти данные (Банальный MGDB = inpunt() ) и так буквально раз 10 надо вводить что-то с клавиатуры в режиме терминала.
Сейчас встал вопрос о необходимости единого центра управления этими скриптами.
Т.е запускаем start.py и там уже надо сделать запуск этих самых скриптов. Но как запустит из одного скрипта другой в интерактивном режиме? Т.е запускаем условный start.py, а из него MongoDB.py, который уже уже требует ввода данных и режим терминала. Как возможно это реализовать? Заранее благодарю, как минимум за прочтение этого C:

все зависит от ситуации. например в запускаемом скрипте забили на
__main__ и он выглядит примерно так
script.py

a = input("enter")
print("a")

то наш start.py будет выглядеть так
start.py

import script

Когда мы делаем импорт некоторый код будет выполнен. Тот который не спрятан в метод.
А если не забили на
__main__?
script.py

if __name__ == '__main__':
    a = input("enter")
    print("a")

То запустить его можно так

from pathlib import Path

if __name__ == '__main__':
    code = compile(Path("script.py").read_text(), "script.py", "exec")
    exec(code, {"__name__": "__main__"})

Ну и subprocess конечно же

import sys
from subprocess import call

if __name__ == '__main__':
    call(f"{sys.executable} script.py", shell=True)

Ну и еще можно os.system

import sys
import os

if __name__ == '__main__':
    os.system(f"{sys.executable} script.py")


Генерация списка всевозможных строк с добавлением точки
У меня есть строка, например
'abcd'. Мне нужно сгенерировать всевозможные вариации этой строки с добавлением точки, например:

'a.bcd'
'ab.cd'
'abc.d'
...
'a.b.cd'
'a.b.c.d'
'a.b.c.d.'

Можно скомбинировать список из строки
abcd со списком из
['','.']. Из строк abcd делаем список
['','a','b','c','d']. С помощью
itertools.product() делаем все возможные расположения под список символов из списка
['','.']. Потом суммируем через
zip().

import itertools

text = 'abcd'
symbols = ['', *list(text)]
filler = ['','.']  # Список для создания комбинаций расположения пустого места и точки
combine = [list(zip(symbols, r)) for r in list(itertools.product(filler, repeat=len(symbols)))]
print(*[''.join([c for item in row for c in item]) for row in combine], sep='\n')

Вывод

abcd
abcd.
abc.d
abc.d.
ab.cd
ab.cd.
...
.a.b.c.d
.a.b.c.d.


Парсинг каждого слова через запятую
Я делаю парсинг excell документа и получаю список элементов. Каждый элемент, это строка в которой через запятую указаны характеристики продукта. Как лучше реализовать отделение их друг от друга?
Допустим, метод возвращает строку "Intel-Core i7 - 10700F, 2.9 GHz, 16MB, oem, LGA1200, Comet Lake".
Задача из строки сделать коллекцию или json объект в виде
<code>
{
 "title":"Intel-Core i7 - 10700F",
 "frequency":"2.9 GHz",
 "cache":"16MB",
 "oem":"oem",
 "socket": "LGA1200",
 "gen": "Comet Lake"
 }
</code>

s = "Intel-Core i7 - 10700F, 2.9 GHz, 16MB, oem, LGA1200, Comet Lake"

res = dict(zip(("title", "frequence", "cache", "oem", "socket", "gen"), s.split(", ")))
print(res)


PyQt5 QButtonGroup() как передать имя нажатой кнопки в функцию?
пишу непобедимые крестики нолики и столкнулся с проблемой:
<code>
self.btn_grp = QButtonGroup()
self.btn_grp.setExclusive(True)
self.btn_grp.addButton(self.pushButton_6, id = 6)
self.btn_grp.addButton(self.pushButton_7, id = 7)
self.btn_grp.addButton(self.pushButton_2, id = 2)
self.btn_grp.addButton(self.pushButton_1, id = 1)
self.btn_grp.addButton(self.pushButton_5, id = 5)
self.btn_grp.addButton(self.pushButton_9, id = 9)
self.btn_grp.addButton(self.pushButton_8, id = 8)
self.btn_grp.addButton(self.pushButton_3, id = 3)
self.btn_grp.addButton(self.pushButton_4, id = 4)
self.btn_grp.checkedId()
self.btn_grp.buttonClicked.connect(self.pressed())
</code>
как мне передать имя нажатой кнопки через conect в функцию
или хотябы id?

Пример для получения id кнопки и ее текста
Обратите внимание, что подправил код коннекта, т.к. туда нужно передавать ссылку на функцию, а не результат ее выполнения
Попробуйте:
<code>
    ...
    self.btn_grp.buttonClicked.connect(self.pressed)

def pressed(self, button):
    print(self.btn_grp.id(button), button.text())
</code>


Вывод разницы во времени текстом
Всех приветствую. Я бы хотел узнать есть ли такая библиотека на python, чтобы код выводил промежуток времени словами, например разница в 13 сек, и скрипт выводит
меньше минуты назад или же разница ровна 2 дня, то скрипт выводит
более 2 дней

Для работы с датами и промежутками времени удобно использовать стандартный модуль datetime. В данном случае нужно вычесть две сравниваемые даты в виде
datetime (в примере ниже -
datetime.now() - datetime(2021, 7, 14, 8, 0) - из текущей даты/времени вычесть 14.07.2021 8:00), результатом будет
timedelta (разница времени), эту дельту сравнивать с разными промежутками времени, в зависимости от результата выводить то что вам нужно, пример:

from datetime import datetime, timedelta

def text_delta(t: timedelta) -> str:
    if t < timedelta(minutes=1):
        return "меньше минуты назад"
    elif t < timedelta(hours=1):
        return f"{t.total_seconds() // 60:.0f} минут назад"
    elif t < timedelta(days=1):
        return f"{t.total_seconds() // 3600:.0f} часов назад"
    elif t < timedelta(days=30):
        return f"{t.days} дней назад"
    elif t < timedelta(days=365):
        return f"{t.days // 30} месяцев назад"
    else:
        return f"{t.days // 365} лет назад"

print(text_delta(datetime.now() - datetime(2021, 7, 14, 8, 0)))
print(text_delta(timedelta(seconds=13)))
print(text_delta(timedelta(minutes=13)))
print(text_delta(timedelta(hours=13)))
print(text_delta(timedelta(days=13)))
print(text_delta(timedelta(days=30*3)))
print(text_delta(timedelta(days=365*3)))

Вывод:

2 часов назад
меньше минуты назад
13 минут назад
13 часов назад
13 дней назад
3 месяцев назад
3 лет назад

Для правильного склонения часов/минут и т.д. можно использовать pymorphy2: Согласование слов с числительными


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

Решение было найдено. Модуль Natasha при синтаксическом разборе даёт каждому слову head_id, которое представляет из себя id родителя. Например:
<code>
┌──────► Автобус     nsubj
│     ┌► ,           punct
│ ┌─┌─└─ едущий
│ │ └──► сюда        advmod
│ └────► ,           punct
└─────┌─ остановился
      └► .           punct
SyntaxMarkup(tokens=[SyntaxToken(id='1_1', text='Автобус', head_id='1_6', rel='nsubj'), SyntaxToken(id='1_2', text=',', head_id='1_3', rel='punct'), SyntaxToken(id='1_3', text='едущий', head_id='1_1', rel='acl'), SyntaxToken(id='1_4', text='сюда', head_id='1_3', rel='advmod'), SyntaxToken(id='1_5', text=',', head_id='1_3', rel='punct'), SyntaxToken(id='1_6', text='остановился', head_id='1_0', rel='root'), SyntaxToken(id='1_7', text='.', head_id='1_6', rel='punct')])
</code>


Является ли объект числом в Python 3 без использования модуля numbers?
Как определить, является ли какой-то объект числом?
Есть известные методы
str().isdigit() и
str().isnumeric() для строк, но они уже не работает в случае комплексных чисел, или даже для вещественных.
Я нашел метод использующий модуль
numbers, такой код:

import numbers

variable = 5
print(isinstance(5, numbers.Number))

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

Попробуйте так

>>> variable = 5
>>>
>>> print(isinstance(variable, int))
True

>>> variable = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1
>>>
>>> variable
0.9999999999999999
>>> print(isinstance(variable, float))
True


Задача исключительно с циклом While требует доработки (новичок)
Задача:
Когда у банка есть финансовые проблемы, правительство может вернуть депозит клиента, если он меньше 700 000. Процентная ставка по конкретному депозиту составляет 7,1% годовых. Проценты выплачиваются на тот же депозит в конце года, и рассчитывается новое значение процентов.
Узнайте, сколько лет потребуется, чтобы сумма депозита превысила стоимость, охраняемую государством.
Мой код (я чувствую, что с ним что-то не то, но не могу понять, ЧТО ИМЕННО. Истина крутится рядом с year.):
<code>
deposit=int(input())
year = 0
while deposit < 700000:
    deposit = deposit + (deposit * 0.071)
    year =+ 1
print(year)
</code>

У вас ошибка в коде.
Вместо
year =+ 1 нужно
year += 1.

year =+ 1 каждый раз присваивает переменной
year единицу.


Как увеличить значение в строке по заданному индексу?
Переменная
index содержит строку.
необходимо увеличить значение возраста в строке индексом равным index на 1. и вывести фрейм данных.

df = pd.DataFrame({'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],
                   'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],
                   'name': ['Murzik', 'Pushok', 'Kaa', 'Bobik', 'Strelka', 'Vaska', 'Kaa2', 'Murka', 'Graf', 'Muhtar'],
                   'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],
                   'priority': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']},
                  index = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'])

index = 'f'

Я пробую решить следующим образом:

print(df.loc[index].at['age'] + 1)

Но выводит измененное значение ячейки, а не измененный фрейм данных.

"Accessor" DataFrame.loc[index_labels, column_labels] принимает в качестве второго аргумента наименования столбцов:

df.loc[index, "age"] += 1

print(df)

вывод:

  animal  age     name  visits priority
a    cat  2.5   Murzik       1      yes
b    cat  3.0   Pushok       3      yes
c  snake  0.5      Kaa       2       no
d    dog  NaN    Bobik       3      yes
e    dog  5.0  Strelka       2       no
f    cat  3.0    Vaska       3       no
g  snake  4.5     Kaa2       1       no
h    cat  NaN    Murka       1      yes
i    dog  7.0     Graf       2       no
j    dog  3.0   Muhtar       1       no


Попробуйте так:

data1["promo_id"] = (
    (data1["store_id"] != data1["store_id"].shift().bfill())
    |
    (data1["period_id"].diff().fillna(1).ne(1))
).cumsum().add(1)
data1['promo_cw'] = data1.groupby("promo_id").cumcount()

результат:

In [77]: data1
Out[77]:
   store_id  period_id  promo_id  promo_cw
0   4168621        191         1         0
1   4168621        192         1         1
2   4168621        194         2         0
3   4168621        195         2         1
4   4168621        196         2         2
5   4168624        191         3         0
6   4168624        192         3         1
7   4168626        193         4         0
8   4168626        194         4         1

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


Наличие в словаре ключ : значение
Устал уже изобретать велосипед и работать со словарями вручную. Кто подскажет универсальный способ проверять наличие ключа : значения в словаре. Важно! Вложенность словаря достигает 5 уровней.
Могут быть следующие ситуации:

Ключ : значение существуют
Ключ : значение НЕ существуют
Ключ существует : значение пустое или None

Возвращать True только в первом случае, не выкидывать исключения.
На данный момент я проверяю обычными методами словаря, например так:

if owner.get("email"):                                # Может быть или не быть
    if owner.get('email').get("value"):               # Может быть или не быть, также значение может быть None
        out["emailAddress"] = owner["email"]["value"]
        out["invoiceDeliveryType"] = 1
    else:
        out["invoiceDeliveryType"] = 2
else:
    out["invoiceDeliveryType"] = 2

Есть ли универсальный способ для определения, что ключ : значение существует и значение не пусто, не зависимо от уровня вложенности
Входные данные:
1 случай:

{
    "data":{
        "invoice_id": 17304,
        "location_name": "live",
        "owner":{
            "email":{
                "value":"[email protected]",
                "note" : "notice"
            },
            "name":"Petruxa Stepanovich",
            "role":1,
            "phone":{
                "prefix":"+7",
                "number":"000000000"
            }
        }
    }
}

2 случай

{
    "data":{
        "invoice_id": 17304,
        "location_name": "live"
    }
}

3 случай

{
    "data":{
        "invoice_id": 17304,
        "location_name": "live",
        "owner":{
            "email":None,
            "name":"Petruxa Stepanovich",
            "role":1,
            "phone":{
                "prefix":"+7",
                "number":"000000000"
            }
        }
    }
}

Ну можно немного сократить ваш код, плюс я написал функцию, достающую значение из вложенного словаря, хотя, кажется, уже были подобные вопросы и там должны быть подобные функции реализованы:
<code>
def safe_get(data, key_chain):
    for key in key_chain.split('/'):
        if not (data and key in data):
            return None
        data = data[key]
    return data

email = safe_get(data_dict, 'data/owner/email/value')
if email:
    out["emailAddress"] = email
    out["invoiceDeliveryType"] = 1
else:
    out["invoiceDeliveryType"] = 2
</code>


Как получить информацию о пользователе VK (имя, например) по его id с помощью vk_api?
Есть такой код
<code>
import vk_api
from vk_api.longpoll import VkLongPoll, VkEventType
from main_token import main_token

vk_session = vk_api.VkApi(token = main_token)
session_api = vk_session.get_api()
longpoll = VkLongPoll(vk_session)

for event in longpoll.listen():
        if event.type == VkEventType.MESSAGE_NEW:
                if event.to_me:
                        msg = event.text.lower()
                        id = event.user_id
                        info = session_api.users.get(users_id = event.user_id)
                        print(len(info))
                        vk_session.method("messages.send", {"user_id":id, "message":f"Hi, @id{event.user_id}","random_id":0})

Да, я знаю, что этот вопрос уже задавался, но у меня все равно ничего не работает. Почему-то структура info имеет в итоге размер 0, то есть никакой информации я не получаю. Как это исправить?
</code>

id = event.user_id
user_get = vk.users.get(user_ids=(id))
user_get = user_get[0]

Вдруг, если нужно:

first_name = user_get['first_name'] #Имя пользователя
last_name = user_get['last_name'] #Фамилия


Ошибка при написании калькулятора на python
изучаю питон и пытаюсь писать калькулятор на нем же. Имеется вот такой вот код:

def calculate():
 operation = input('''
 Please type in the math operation you would like to complete:
 + for addition
 - for subtraction
 * for multiplication
 / for division
 ''')
 number_1 = int(input('Please enter the first number: '))
 number_2 = int(input('Please enter the second number: '))
 if operation == '+':

      print('{} + {} = '.format(number_1, number_2))
      print(number_1 + number_2)
 elif operation == '-':
   print('{} - {} = '.format(number_1, number_2))
   print(number_1 - number_2)
 elif operation == '*':
   print('{} * {} = '.format(number_1, number_2))
   print(number_1 * number_2)
 elif operation == '/':
   print('{} / {} = '.format(number_1, number_2))
   print(number_1 / number_2)
 else:
   print('You have not typed a valid operator, please run the program again.')
 # Добавление функции again() в calculate()
 again()
 def again():
  calc_again = input('''
  Do you want to calculate again?
  Please type Y for YES or N for NO.
  ''')
 if calc_again.upper() == 'Y':
   calculate()
 elif calc_again.upper() == 'N':
   print('See you later.')
 else:
  again()
calculate()

Результатом  является частичное выполнение и ошибка:

Please type in the math operation you would like to complete:

     + for addition
     - for subtraction
     * for multiplication
     / for division
     -
    Please enter the first number: 12
    Please enter the second number: 12
    12 - 12 =
    0
    Traceback (most recent call last):
      File "D:\Among Us\dg.py", line 79, in <module>
        calculate()
      File "D:\Among Us\dg.py", line 67, in calculate
        again()
    UnboundLocalError: local variable 'again' referenced before assignment
    >>>

Подскажите, пожалуйста, как это можно исправить

Вы ничего не ответили человеку в комментариях, вот полностью рабочий код, который решает проблему
<code>
def again():
    calc_again = input('''
    Do you want to calculate again?
    Please type Y for YES or N for NO.
    ''')
    if calc_again.upper() == 'Y':
        calculate()
    elif calc_again.upper() == 'N':
        print('See you later.')
    else:
        again()

def calculate():
    operation = input('''
    Please type in the math operation you would like to complete:
    + for addition
    - for subtraction
    * for multiplication
    / for division
    ''')
    number_1 = int(input('Please enter the first number: '))
    number_2 = int(input('Please enter the second number: '))
    if operation == '+':

        print('{} + {} = '.format(number_1, number_2))
        print(number_1 + number_2)
    elif operation == '-':
        print('{} - {} = '.format(number_1, number_2))
        print(number_1 - number_2)
    elif operation == '*':
        print('{} * {} = '.format(number_1, number_2))
        print(number_1 * number_2)
    elif operation == '/':
        print('{} / {} = '.format(number_1, number_2))
        print(number_1 / number_2)
    else:
        print('You have not typed a valid operator, please run the program again.')
        # Добавление функции again() в calculate()
    again()

calculate()
</code>


Как убрать вылет из программы из-за eval python
У меня есть код который при неправильном значении сказанного выводит ошибку. Например "365-7" работает верно но если данные типа "67 огурец" то вылетает и пишет unexpected EOF while parsing. Как сделать защиту от неправильных данных? Вот код
<code>
         while a == 1:
            voice_input = record_and_recognize_audio()
            os.remove("microphone-results.wav")
            print(voice_input)
            if voice_input == "стоп": a = 2
            if voice_input == "калькулятор":
                while b == 1:
                    print("Назовите пример:")
                    d = record_and_recognize_audio()
                    os.remove("microphone-results.wav")
                    if d == "выйти":
                        print("выход произошел")
                        break
                    print(d)
                    m = eval(d)
                    print("ответ:", m)```
</code>

try:
    m = eval(d)
    print("ответ:", m)
except:
    print("что-то пошло не так")


Как создать словарь, с вложенным словарем и сортировкой по дате на Python (3.9.6)
У меня есть список вывода логов биометрического контроля из текстового файла. Данные логи контроллера были отформатированы, и занесены как список. Данные значения уже до этого отсортированы, в список "заходит" первое событие, и последнее. В формате:

monitor_last_first = [
    ['Ваня', '8:33', '01.01.1995'],
    ['Ваня', '18:40', '01.01.1995'],
    ['Петя', '9:42', '01.01.1995'],
    ['Петя', '21:51', '01.01.1995'],
    ['Петя', '9:02', '02.01.1995'],
    ['Петя', '18:51', '02.01.1995'],
    ['Женя', '10:01', '01.01.1995'],
    ['Женя', '20:51', '01.01.1995'],

]

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

monitor_dict = {
    {'Ваня': {'01.01.1995': ['08:33', '18:40']}},
    {'Петя': {'01.01.1995': ['09:42', '21:51']}, {'02.01.1995': ['09:02', '18:51']},
    ['Женя': {'01.01.1995': ['10:01', '20:51']},

}

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

Решение в одну строчку, если не считать импортов... :)
<code>
from itertools import groupby
from operator import itemgetter

monitor_dict = dict([person, dict([date, list(map(itemgetter(1), times))] for date, times in groupby(visits, itemgetter(2)))] for person, visits in groupby(monitor_last_first, itemgetter(0)))
</code>


Блок с текстом сдвигается с центра экрана при изменении количества букв
только начал осваивать программирование и столкнулся с такой проблемой:
то есть при успешном заказе на сайте выдает "name Спасибо за заявку!",а во всех остальных случаях "Спасибо страница!" ,так вот дело в том,что в первом случае все работает нормально,а вот во втором (так как там меньшее количество символов) текст уезжает в сторону и никак не хочет вставать по центру,даже если задаю фиксированную длину,ширину и отступы.

{% extends 'base.html' %}
{% load static %}

{% block thanks %}

        {% if name %}

 {{ name }},
Спасибо за заявку!

        {% else %}

Спасибо
страница!
#

        {% endif %}

{% endblock %}

CSS
text-aling: center; для
h1 элемента.

<h1 style="text-align: center;"> {{ name }},
Спасибо за заявку!</h1>

Или поместите
<center> внутрь
h1 элемента.

<h1><center> {{ name }},
Спасибо за заявку!</center></h1>

h1 является блочным элементом и занимает к  тому же 100% доступной ширины, так что отцентровать его содержимое вашим способом не получится.


Как правильно составить условие? [дубликат]

На этот вопрос уже даны ответы здесь:

Проверка на целое число—условие на проверку данных, введенных пользователем

                                (6 ответов)

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

Я не могу разобраться, как правильно составить условие программы. Сам код:
<code>
text = input('Введите текст: ')

if int(text):
    print('Вы ввели число!')
else:
    print('Вы ввели текст!')
</code>
Пишу телеграм бот, но конкретно этот кусок кода я не понимаю как сделать.
Если переменная text является int, то работает print.
Но как только боту написать обычный текст, сразу ошибка. Пишет: text не является int().
Помогите...

Если переменная text является int

Для приведенного кода это неправильное понимание. Правильно так: если строку, содержащуюся в text можно преобразовать в целое число.
int() превращает строку в число. Если такое невозможно. А если невозможно, то возникает ошибка. Что должно выйти на
int("привет")? "привет" невозможно преобразовать в число, поэтому и ошибка.
Кстати, если ввести "0", то его можно преобразовать в целое число, но код все равно выдаст "вы ввели текст".
Один из вариантов - использовать try..except.


Не извлекается элемент списка Python
при сохранении результатов в json единственный элемент списка, переменной amount отображается в квадратных скобках, во так:   "amount": "['130']", вместо: "130"
Вот мой код:
<code>
name = soup.select_one('.ad-detail-title').text.strip()
amount = soup.select_one('.pagAnuPrecioTexto')
about = soup.select_one('.pagAnuCuerpoAnu')
ref = soup.select_one('.pillDiv pillRef')
location = soup.select_one('.pagAnuCatLoc').text.strip()
created = soup.select_one('.pagAnuStatsCreated').text.strip()

amount = regex.findall('(\d+)', str(amount))

item = {
    'name': name,
    'amount': str(amount),
    'about': about,
    'ref': str(ref),
    'location': str(location),
    'created': str(created),
    'url': url,
}
data.append(item)

return data
</code>
При попытке указания позиции в списке [0] возвращается ошибка: "list index out of range python" В чём тут дело?

У вас в
amount ниже будет список строк, найденных в
amount:

amount = regex.findall('(\d+)', str(amount))

item = {
    'name': name,
    'amount': str(amount),
    ...

И при вашей попытке оставить первое значение из списка через
str(amount[0]) привело к ошибке, т.к. встретилось значение
amount, в котором цифр не было, поэтому вам нужно добавить проверку, например:

...
item = {
    'name': name,
    'amount': amount[0] if amount else "0",
    ...


Telegram bot (aiogram). Отвечает на фото тогда, когда не нужно
Доделываю своего бота в телеграме. Обнаружил, что он реагирует на фото тогда, когда это не нужно.
Есть кусок кода:

b1 = InlineKeyboardButton('XXXXXXXXXX', callback_data='adm',)
b2 = InlineKeyboardButton('XXXXXXXXXX', callback_data='art')
Back = InlineKeyboardButton('XXXXXXXX, callback_data='back')

KBB = InlineKeyboardMarkup().add(Back)
KB = InlineKeyboardMarkup().add(b1).add(b2)

@dp.message_handler(commands=['start'])
async def firstmessage(msg: types.Message):
    dir1 = 'XXXXXXXX'
    with open(dir1, 'rb') as pic1:
        await bot.send_photo(msg.from_user.id, pic1, caption=XXXXX, reply_markup=KB)

@dp.callback_query_handler(lambda c: c.data == 'back')
async def back_to_menu(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    dir2 = 'XXXXXXXXXX'
    with open(dir2, 'rb') as pic2:
        await bot.send_photo(callback_query.from_user.id, pic2, caption='XXXXXX', reply_markup=KB)

@dp.callback_query_handler(lambda c: c.data == 'adm')
async def admcontact(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    await bot.send_message(callback_query.from_user.id, 'XXXXXXXXX', reply_markup=KBB)

@dp.callback_query_handler(lambda c: c.data == 'art')
async def artpred(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    await bot.send_message(callback_query.from_user.id, 'XXXXXXX', reply_markup=KBB)
    @dp.message_handler(content_types=["photo"])
    async def replying(pic):
        await bot.send_photo(XXXXXXXXXXX, pic.photo[-1].file_id)
        await bot.send_message(pic.from_user.id, 'XXXXXXXX', reply_markup=KBB)

Если скинуть боту фотографию до активации строчки,

@dp.callback_query_handler(lambda c: c.data == 'art')
async def artpred(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    await bot.send_message(callback_query.from_user.id, 'XXXXXXX', reply_markup=KBB)
    @dp.message_handler(content_types=["photo"])
    async def replying(pic):
        await bot.send_photo(XXXXXXXXXXX, pic.photo[-1].file_id)
        await bot.send_message(pic.from_user.id, 'XXXXXXXX', reply_markup=KBB)

То всё будет нормально. (Бот не будет отвечать на отправленное фото)
Если же нажать на кнопку b2 (те активировать этот самый кусок фото), а после перейти обратно к другой клавиатуре, то бот уже будет пересылать отправленное фото тогда, когда не надо.

Зачем Вам обработчик для фотографий, вложенный в функцию для обработки коллбэков? Они должны быть разделены. Вместо:

@dp.callback_query_handler(lambda c: c.data == 'art')
async def artpred(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    await bot.send_message(callback_query.from_user.id, 'XXXXXXX', reply_markup=KBB)
    @dp.message_handler(content_types=["photo"])
    async def replying(pic):
        await bot.send_photo(XXXXXXXXXXX, pic.photo[-1].file_id)
        await bot.send_message(pic.from_user.id, 'XXXXXXXX', reply_markup=KBB)

Должно быть так

@dp.callback_query_handler(lambda c: c.data == 'art')
async def artpred(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    await bot.send_message(callback_query.from_user.id, 'XXXXXXX', reply_markup=KBB)

@dp.message_handler(content_types=["photo"])
async def replying(pic):
    await bot.send_photo(XXXXXXXXXXX, pic.photo[-1].file_id)
    await bot.send_message(pic.from_user.id, 'XXXXXXXX', reply_markup=KBB)

Если Вы хотите, чтобы бот начинал диалог с пользователем и ждал от него фотографии только тогда, когда юзер нажал на кнопку
art, то реализовать такое можно с помощью aiogram FSM:

class UploadPhotoForm(StatesGroup):
    photo = State()

@dp.callback_query_handler(lambda c: c.data == 'art')
async def artpred(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)

    await UploadPhotoForm.photo.set()

@dp.message_handler(lambda message: message.photo is None, state=UploadPhotoForm.photo)
async def process_photo_invalid(message: types.Message):
    return await message.reply("Фотография не найдена в сообщении!")

@dp.message_handler(lambda message: message.photo is not None, state=UploadPhotoForm.photo)
async def process_photo(message: types.Message, state: FSMContext):
    file_id = message.photo[-1].file_id  # file ID загруженной фотографии
    # await bot.send_message(callback_query.from_user.id, 'XXXXXXX', reply_markup=KBB)
    await bot.send_message(callback_query.from_user.id, "Фотография успешно загружена!")
    await state.finish()