При передаче переменной в другой скрипт она обнуляется
Имеется переменная 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 шт):
Вместо использования глобальных переменных, создадим класс для хранения данных пользователя. Это позволит нам инкапсулировать данные и обеспечить их согласованность между модулями.
- Создадим класс
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
упрощает вывод информации.
Этот подход решает проблему с обновлением переменных между скриптами, улучшает структуру кода и делает его более надежным и легким для поддержки. Можно использовать и другие подходы