小编Luc*_*oca的帖子

函数本地名称绑定外部作用域

我需要一种方法从外部代码块"注入"函数到函数中,因此它们可以在本地访问,并且它们不需要由函数的代码(定义为函数参数,从*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)

并担心将他需要的每个对象添加到此行.

任何建议都非常感谢.

python scope decorator

13
推荐指数
1
解决办法
2061
查看次数

标签 统计

decorator ×1

python ×1

scope ×1