栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用装饰器将变量注入作用域?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用装饰器将变量注入作用域?

你不能 作用域名称(闭包)在编译时确定,不能在运行时添加更多。

您可能希望实现的最好方法是使用函数 自己的 全局名称空间添加 全局 名称: __

def decorator_factory(value):    def msg_decorator(f):        def inner_dec(*args, **kwargs): g = f.__globals__  # use f.func_globals for py < 2.6 sentinel = object() oldvalue = g.get('var', sentinel) g['var'] = value try:     res = f(*args, **kwargs) finally:     if oldvalue is sentinel:         del g['var']     else:         g['var'] = oldvalue return res        return inner_dec    return msg_decorator

f.__globals__
是包装函数的全局名称空间,因此即使装饰器位于其他模块中也可以使用。如果
var
已经定义为全局变量,则将其替换为新值,并在调用函数后恢复全局变量。

之所以可行,是因为在函数中任何未分配给且在周围范围中找不到的名称都被标记为全局名称。

演示:

>>> c = 'Message'>>> @decorator_factory(c)... def msg_printer():...     print var... >>> msg_printer()Message>>> 'var' in globals()False

但是除了修饰,我也可以 直接

var
在全局范围内进行定义。 __

请注意,更改全局变量不是线程安全的,并且对同一模块中其他函数的任何瞬时调用也仍将看到该相同的全局变量。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/669041.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号