Совместное использование проекта Android Studio с Github без предоставления доступа к базе данных Firebase

Причина, по которой вы не можете изменять локальные переменные внутри функции, используя exec таким образом, и почему exec действует так, как это делается, можно суммировать следующим образом:

  1. exec - это функция, которая разделяет ее локальную область действия с областью самой внутренней области, в которой она вызвана.
  2. Всякий раз, когда вы определяете новый объект в пределах области действия, он будет доступен в своем локальном пространстве имен, т. е. он изменит словарь 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).


  1. Python начинает поиск имен из локального пространства имен. Он известен как способ LEGB. Python начинается с Local namespce, затем просматривает области Enclosing, затем Global и в конце просматривает имена в пространстве имен Buit-in.

Более подробный пример будет примерно следующим:

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
0
задан Zoe 19 March 2019 в 11:05
поделиться

1 ответ

Не регистрируйте свой файл google-services.json. Здесь приложение получает знания о том, как получить доступ к базе данных. Попросите пользователей вашего исходного кода создать свой собственный проект Firebase и добавить в проект свой собственный файл google-services.json, чтобы получить собственную базу данных для работы.

Кстати, если ваше приложение не использует Аутентификацию Firebase и ему дано разрешение на чтение и запись базы данных, то любой, кто знает имя вашего проекта, также сможет читать и записывать базу данных. Название вашей базы данных можно получить, просто взломав APK.

0
ответ дан Doug Stevenson 19 March 2019 в 11:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: