Причина, по которой вы не можете изменять локальные переменные внутри функции, используя exec
таким образом, и почему exec
действует так, как это делается, можно суммировать следующим образом:
exec
- это функция, которая разделяет ее локальную область действия с областью самой внутренней области, в которой она вызвана. local()
. Когда вы определяете новый объект в exec
, то, что он делает, примерно эквивалентно следующему: from copy import copy
class exec_type:
def __init__(self, *args, **kwargs):
# default initializations
# ...
self.temp = copy(locals())
def __setitem__(self, key, value):
if var not in locals():
set_local(key, value)
self.temp[key] = value
temp
- временное пространство имен, которое сбрасывается после каждого экземпляра (каждый время, которое вы вызываете exec
).
Более подробный пример будет примерно следующим:
g_var = 5
def test():
l_var = 10
print(locals())
exec("print(locals())")
exec("g_var = 222")
exec("l_var = 111")
exec("print(locals())")
exec("l_var = 111; print(locals())")
exec("print(locals())")
print(locals())
def inner():
exec("print(locals())")
exec("inner_var = 100")
exec("print(locals())")
exec("print([i for i in globals() if '__' not in i])")
print("Inner function: ")
inner()
print("-------" * 3)
return (g_var, l_var)
print(test())
exec("print(g_var)")
Выход:
{'l_var': 10}
{'l_var': 10}
locals являются одинаковыми
{'l_var': 10, 'g_var': 222}
после добавления g_var
и изменения l_var
он добавляет только g_var
и оставил неизменяемый l_var
{'l_var': 111, 'g_var': 222}
l_var
, потому что мы меняем и печатаем местные жители в одном экземпляре (один вызов exec)
{'l_var': 10, 'g_var': 222}
{'l_var': 10, 'g_var': 222}
В локальных локалях функции и локальном l_var
exec не изменяется, а g_var
добавлен
Inner function:
{}
{'inner_var': 100}
{'inner_var': 100}
inner_function
. Локальная такая же, как и локальная команда exec
['g_var', 'test']
global содержит только g_var
и имя функции (после исключения специальных методов)
---------------------
(5, 10)
5
Не регистрируйте свой файл google-services.json. Здесь приложение получает знания о том, как получить доступ к базе данных. Попросите пользователей вашего исходного кода создать свой собственный проект Firebase и добавить в проект свой собственный файл google-services.json, чтобы получить собственную базу данных для работы.
Кстати, если ваше приложение не использует Аутентификацию Firebase и ему дано разрешение на чтение и запись базы данных, то любой, кто знает имя вашего проекта, также сможет читать и записывать базу данных. Название вашей базы данных можно получить, просто взломав APK.