@chtopisatsuda

Как передать из функции в другую переменную не вызывая ее?

в функции auth есть переменная d:
d = Dnevnik(login=loginDb, password=passwordDb)

надо передать d в другую функцию, но при этом не вызывать ее!
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ответы на вопрос 3
Dr_Elvis
@Dr_Elvis Куратор тега Python
В гугле забанен
Передать без вызова - никак.
Сохраняйте переменную в базе данных или, к примеру, redis. А в нужный момент вытаскивайте и работайте с ней.
Ответ написан
Комментировать
@dmshar
А зачем в функции значение переменной если вы ее (функцию) не вызываете? Не вызываете - значит она (функция) выполняться не будет. Так зачем ей это значение?

А вообще-то есть ТРИ способа передачи переменных:
1. Через указание параметра.
2. Через глобальную переменную (не рекомендуется).
3. Через внешнее хранилище информации - файл, БД и пр.

Ничего другого человечество не придумало. Вот и выбирайте.
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
С учётом контекста твоих предыдущих вопросов - ты пытаешься реализовать мой совет, но получается плохо.
Смотри.

#сначала реализуем механизм, который позволяет получать объект дневник для пользователя
import typing
from functools import lru_cache
# говорим, что результаты вызова функции должны кэшироваться,
# но храниться в кэше должно не более 50 экземпляров класса Dnevnik
# при появлении новых экземпляров, самые старые будут выкинуты
@lru_cache(maxsize=50)
# принимаем ID пользователя Telegram, возвращаем или объект Dnevnik, или None
def get_user_dnevnik(user_id) -> typing.Optional[Dnevnik]:
    # получаешь новый курсор для своего соединения с БД
    # я фз как у тебя называется глобальная переменная, хранящая соединение, 
    # так что назвал её db_conn. Поправишь
    cursor = db_conn.cursor()
    # выбираем из таблицы логинов/паролей пару, соответствующую указанному пользователю
    # имена таблицы и столбцов опять таки поправь, я не помню как они у тебя называются
    cursor.execute("SELECT loginD, passwordD FROM users WHERE id = ?", (user_id,))
    row = cursor.fetchone()
    if row is None: # нет такого пользователя, возвращаем None
        return None
    # в запросе порядок столбцов сначала логин, потом пароль, так что row = (логин, пароль)
    return Dnevnik(login=row[0], password=row[1]) # возвращаем объект Dnevnik


Теперь, всякий раз, когда тебе требуется объект Dnevnik для пользователя с известным id, вызываешь функцию
get_user_dnevnik(), передав ей в параметрах этот id.
Поскольку мы указали для функции lru_cache, фактически запрос к БД и конструирование объекта Dnevnik будет выполняться только если в кэше нет дневника для пользователя с этим id. А если он есть, то дневник будет быстренько возвращён из кэша.
В то же время кэш будет расти не беспредельно, его размер мы явно задаём и можем подогнать под свои нужды, чтобы балансировать потребление кэшем памяти и потребление проца повторным созданием экземпляров Dnevnik.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы