При передаче переменной в другой скрипт она обнуляется

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

script1.py

import script2
username = " "
id=""
user_name=" "


def get_user(usid,us_name,usname):
    id=usid
    user_name=us_name
    username = usname
    print(id,user_name,username)
    script2.show()


@router.message(CommandStart())
async def start(message:Message)->None:
    await message.reply('Click',reply_markup=webapp_builder())
    Username = message.from_user.username
    idus=message.from_user.id
    User_name=message.from_user.first_name
    add_user_to_db(id,user_name,username,None)
    get_user(idus,User_name,Username)

script2.py

import script1


def show():
    print(script1.username)

При таких действиях при выполнении show() выводиться пустота.


Ответы (1 шт):

Автор решения: sLoNcE

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

  • Создадим класс UserData для хранения информации о пользователе.
  • Используем паттерн singleton для обеспечения единственного экземпляра UserData.
  • Модифицируем оба скрипта для работы с этим классом.

user_data.py:

from typing import Optional

class UserData:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            cls._instance.id: Optional[int] = None
            cls._instance.user_name: Optional[str] = None
            cls._instance.username: Optional[str] = None
        return cls._instance

    def update(self, id: int, user_name: str, username: str) -> None:
        self.id = id
        self.user_name = user_name
        self.username = username

    def __str__(self) -> str:
        return f"UserData(id={self.id}, user_name={self.user_name}, username={self.username})"

script1.py:

from user_data import UserData
import script2

user_data = UserData()

def get_user(usid: int, us_name: str, usname: str) -> None:
    user_data.update(usid, us_name, usname)
    print(user_data)
    script2.show()

@router.message(CommandStart())
async def start(message: Message) -> None:
    await message.reply('Click', reply_markup=webapp_builder())
    get_user(
        message.from_user.id,
        message.from_user.first_name,
        message.from_user.username
    )
    add_user_to_db(user_data.id, user_data.user_name, user_data.username, None)

script2.py:

from user_data import UserData

def show() -> None:
    user_data = UserData()
    print(f"Username in script2: {user_data.username}")
  • Использование класса UserData с паттерном singleton обеспечивает единственный экземпляр данных пользователя, доступный в обоих скриптах.
  • Метод update в UserData позволяет атомарно обновлять все поля.
  • Типизация помогает предотвратить ошибки и улучшает читаемость кода.
  • Использование метода __str__ в UserData упрощает вывод информации.

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

→ Ссылка