Мне нужен способ "вводить" имена в функцию из внешнего блока кода, поэтому они доступны локально и, им не нужно специально обрабатывать код функции (определенный как параметры функции, загруженные из *args
и т.д.)
Упрощенный сценарий: предоставление структуры, в которой пользователи могут определять (с минимальным синтаксисом) настраиваемые функции для управления другими объектами фреймворка (которые не обязательно global
).
В идеале пользователь определяет
def user_func():
Mouse.eat(Cheese)
if Cat.find(Mouse):
Cat.happy += 1
Здесь Cat
, Mouse
и Cheese
являются объектами инфраструктуры, которые по уважительным причинам не могут быть ограничены глобальным пространством имен.
Я хочу написать оболочку для этой функции, чтобы вести себя следующим образом:
def framework_wrap(user_func):
# this is a framework internal and has name bindings to Cat, Mouse and Cheese
def f():
inject(user_func, {'Cat': Cat, 'Mouse': Mouse, 'Cheese': Cheese})
user_func()
return f
Затем эту оболочку можно применить ко всем пользовательским функциям (как декоратор, самому пользователю или автоматически, хотя я планирую использовать метакласс).
@framework_wrap
def user_func():
Мне известно о ключевом слове Python 3 nonlocal
, но я все же считаю уродливым (с точки зрения пользователя каркаса) добавить дополнительную строку:
nonlocal Cat, Mouse, Cheese
и беспокоиться о добавлении каждого объекта, который ему нужен, в эту строку.
Любое предложение очень ценится.