我需要一种方法从外部代码块"注入"函数到函数中,因此它们可以在本地访问,并且它们不需要由函数的代码(定义为函数参数,从*args
等等加载)专门处理.
简化的场景:提供一框架,使用户能够定义(用尽可能少的语法越好)自定义函数来操纵框架的其他对象(其是不必需global
).
理想情况下,用户定义
def user_func():
Mouse.eat(Cheese)
if Cat.find(Mouse):
Cat.happy += 1
Run Code Online (Sandbox Code Playgroud)
在这里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
Run Code Online (Sandbox Code Playgroud)
然后,这个包装器可以应用于所有用户定义的函数(作为装饰器,由用户自己或自动,虽然我打算使用元类).
@framework_wrap
def user_func():
Run Code Online (Sandbox Code Playgroud)
我知道Python 3的nonlocal
关键字,但我仍然认为丑陋(从框架的用户角度来看)添加额外的一行:
nonlocal Cat, Mouse, Cheese
Run Code Online (Sandbox Code Playgroud)
并担心将他需要的每个对象添加到此行.
任何建议都非常感谢.