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

如何在Python中创建动态范围变量?

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

如何在Python中创建动态范围变量?

我认为大法官在这里的推理是正确的。

另一方面-我无法抗拒为Python的另一种“非自然的”编程范例实现概念证明-我只是喜欢这样做。:-)

因此,我创建了一个类,其对象属性的定义与您的要求相同(并且可以动态创建)。就像我说的那样,它只是处于概念验证状态-
但是我认为,大多数常见错误(例如尝试在根本没有定义的作用域中访问变量)都应该引发错误,即使不是正确的错误(IndexError)例如由于堆栈下溢而不是AttributeError)

import inspectclass DynamicVars(object):    def __init__(self):        object.__setattr__(self, "variables", {})    def normalize(self, stackframe):        return [hash(tpl[0]) for tpl in stackframe[1:]]    def __setattr__(self, attr, value):        stack = self.normalize(inspect.stack())        d = {"value": value, "stack": stack}        if not attr in self.variables: self.variables[attr] = [] self.variables[attr].append(d)        else: our_value = self.variables[attr] if our_value[-1]["stack"] == stack:     our_value[-1]["value"] = value elif len(stack) <= len(our_value):     while our_value and stack !=  our_value["stack"]:         our_value.pop()     our_value.append(d) else: #len(stack) > len(our_value):     our_value.append(d)    def __getattr__(self, attr):        if not attr in self.variables: raise AttributeError        stack = self.normalize(inspect.stack())        while self.variables[attr]: our_stack = self.variables[attr][-1]["stack"] if our_stack == stack[-len(our_stack):]:     break self.variables[attr].pop()        else: raise AttributeError        return self.variables[attr][-1]["value"]# for testing:def c():    D = DynamicVars()    D.c = "old"    print D.c    def a():        print D.c    a()    def b():        D.c = "new"        a()    b()    a()    def c():        D.c = "newest"        a()        b()        a()    c()    a()c()

2020更新
-出现了另一个类似的问题,我设计了一种不需要特殊名称空间对象的hack(但是它诉诸于使用cPython的内部功能,例如将locals()更新为实际变量:(适用于Python 3.8)



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

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

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