Используя пространство имен верхнего уровня, это невозможно. Когда вы запускаете
`var = 1`
, он сохраняет ключ var
и значение 1
в глобальном словаре. Это примерно эквивалентно вызову globals().__setitem__('var', 1)
. Проблема в том, что вы не можете заменить глобальный словарь в запущенном скрипте (вы, вероятно, можете, возившись со стеком, но это не очень хорошая идея). Однако вы можете выполнять код во вторичном пространстве имен и предоставлять собственный словарь для своих глобальных переменных.
class myglobals(dict):
def __setitem__(self, key, value):
if key=='val':
raise TypeError()
dict.__setitem__(self, key, value)
myg = myglobals()
dict.__setitem__(myg, 'val', 'protected')
import code
code.InteractiveConsole(locals=myg).interact()
Это запустит REPL, который почти работает нормально, но отказывается от любых попыток установить переменную val
. Вы также можете использовать execfile(filename, myg)
. Обратите внимание, что это не защищает от вредоносного кода.
Предполагая, что Utils никогда не предназначен для создания экземпляров (это будет просто набор методов), есть ли причина использовать один или другой?
blockquote>Его различные способы создания того же самого. Есть и другие. Поскольку его не нужно создавать, я бы сделал простую версию
const Utils
.Другие способы
, например.
namespace
namespace Utils { export function doSomething() { return 'something' } export function doAnother() { return 'another' } }