Страницы

Поиск по вопросам

воскресенье, 12 января 2020 г.

Как передать значения с одного декоратора функции в другой, возможно ли это?

#python


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

    ...

# при старте бота, запускается каманда 'start'

@bot.message_handler(commands=['start'])
def handle_text(message):
    markup = telebot.types.ReplyKeyboardMarkup(True)
    markup.row('I AM RANDOM')
    # Подключаемся к БД
    db_worker = SQLighter(config.database_name)
    # Получаем количество строк, формируем массив и перемешиваем его
    l = list(range(1, db_worker.count_rows() + 1))  # <<<<<<<
    random.shuffle(l)
    bot.send_message(message.from_user.id, 'Welcome', reply_markup=markup)

# Отлавливаем нажатия на клавишу 'I AM RANDOM'  

@bot.message_handler(content_types=['text'])
def game(message):
    if message.text == 'I AM RANDOM':
        # Подключаемся к БД
        db_worker = SQLighter(config.database_name)
        # Получаем случайную строку из БД
        # массив заранее генерируемых чисел берем с функции декоратора 
        row = db_worker.select_single(l[0]) # <<<<<<<

        markup = telebot.types.ReplyKeyboardMarkup(True)
        markup.row('I AM RANDOM')

        # Отправляем данные
        bot.send_message(message.chat.id, row[1] +'\n\n' + row[5], reply_markup=markup)
        db_worker.close()

...


p.s. цель получить строки в рандомном порядке из БД без повторения
    


Ответы

Ответ 1



def dec1(fn): def wrap(*args, **kwargs): args = list(args) args[0] += 1 kwargs.update(ar=args[0] + 100) n = fn.__name__ res = dt[n] = dec2(num=222)(fn)(*args, **kwargs) return res return wrap def dec2(num=1): def dec_(fn): def wrap(*args, **kwargs): args = list(args) args[0] = args[0] + kwargs.get('ar', 0) + num n = fn.__name__ res = dt[n] = fn(*args) return res return wrap return dec_ @dec1 def asd1(a): return a @dec2() def asd2(a): return a if __name__ == '__main__': dt = {} print(asd1(1)) print(asd2(1)) print(dt) 326 2 {'asd2': 2, 'asd1': 326} Из декоратора dec1 вызываем декоратор dec2 Новые значения в dec2 можно передать через args/kwargs/num

Комментариев нет:

Отправить комментарий