MinTnt
@MinTnt

Как создать объект с запретом на изменение чего-либо на глобальном уровне?

Недавно возник вопрос, о возможности создания объекта, к примеру того же класса, в котором элементы ни при каких условиях, не могли вмешиваться на глобальный уровень
Т.е.
class t:

	def m():
		global a
		a = 5
	m()

print(a)

Здесь всё работает правильно, но всё же хотелось бы что-то, на подобии абсолютно закрытого.

Пожалуй довольно странный пример. Но как добиться такого, чтоб при "global", оно изменяло переменные лишь на уровне класса, как отдельного под-уровня основного кода, который не имеет возможности вмешиваться в основной.

Up. Выражаясь немного по другому. Это как выделение пространства в программе, при котором будет выполнен указанный код, (буд-то он был запущен отдельным файлом), но при этом мы напрямую сможем с ним взаимодействовать внешне, и брать нужные элементы через характерные getattr(), setattr() и тд.
  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Если вы не доверяете импортируемому коду, вы можете отчасти изолировать его в другом процессе с помощью модуля multiprocessing - в том числе по отношению к globals. По-крайней мере, разрушительные действия этого кода будут ограничены. Но он всё ещё может наворотить дел, например, в файловой системе. Кое-что можно будет поправить в нашей функции-обёртке для импорта модуля, но это непростая задача, и реализуется по-разному в зависимости от ОС, под которой работает интерпретатор.
Например,
from multiprocessing import Process

def run_module(modulename: str): #обёртка для импорта модуля.
    try:
        #модуль может содержать код, который выполнится прямо в этот момент
        import modulename 
        #либо мы можем потребовать, чтобы в целевом модуле была отдельная функция-точка входа, например run()
        modulename.run() 
    except Exception as err:
        raise #можем добавить какую-то общую реакцию на ошибки модуля

# описываем новый процесс
p = Process(target=run_module, args=('module_name', ))
p.start() #API процессов имитирует API потоков.

Также модуль предоставляет механизмы для общения между процессами.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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