MinTnt
@MinTnt

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

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

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

print(a)

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

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

Up. Выражаясь немного по другому. Это как выделение пространства в программе, при котором будет выполнен указанный код, (буд-то он был запущен отдельным файлом), но при этом мы напрямую сможем с ним взаимодействовать внешне, и брать нужные элементы через характерные getattr(), setattr() и тд.
  • Вопрос задан
  • 128 просмотров
Решения вопроса 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 потоков.

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

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

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