У этого скрипта действительно серьезные проблемы со стилем и организацией - например, если кто-то импортирует его, он должен каким-то образом предугадать тот факт, что ему нужно установить thescript.foo
для экземпляра Some_Object
перед вызовом some_function
. .. ура! -)
К сожалению, вам приходится изучать Python по плохо написанному сценарию, но я не уверен, что понимаю ваш вопрос. Область видимости переменной в Python - это локальные (включая аргументы), нелокальные (то есть локальные окружения функций для вложенных функций), глобальные переменные, встроенные функции.
Это то, что вы хотите остановить доступ к глобальным? some_function.func_globals
только для чтения, но вы можете создать новую функцию с пустыми глобальными переменными:
import new
f=new.function(some_function.func_code, {})
теперь вызывающий f()
даст исключение NameError: global name 'foo' is not defined
. Вы можете установить это обратно в модуль с именем some_function
или даже сделать это систематически через декоратор, например ::
def noglobal(f):
return new.function(f.func_code, {})
...
@noglobal
def some_function(): ...
это гарантирует, что исключение произойдет при вызове some_function
. Я не совсем понимаю, какую выгоду вы ожидаете получить от этого, хотя. Может быть, вы можете уточнить ...?