python变量如何进行创建_如何在Python中创建动态范围变量?

小编典典

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

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

因此,我创建了一个类,其对象属性的定义与您的要求相同(并且可以动态创建)。就像我说的那样,它只是处于概念验证状态-

但是我认为,大多数常见错误(例如尝试在根本没有定义的作用域中访问变量)都应该引发错误,即使不是正确的错误(IndexError)例如由于堆栈下溢而不是AttributeError)

import inspect

class 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)

2020-12-20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值