gpt4 book ai didi

python - 如何修改另一个作用域的变量?

转载 作者:行者123 更新时间:2023-11-30 23:55:59 24 4
gpt4 key购买 nike

目前,我正在尝试以下操作:某些 mutator 函数使用 locals() 接受其他函数的本地范围

def mutator(locals):
locals['n'] = 10
locals['l'].append(10)

def f():
n = 1
l = [1]
mutator(locals())
print(n,l) # >>> 1, [1,10]

f(None)

这按预期工作:我能够修改可变列表内容,但无法将另一个不可变 int“重新绑定(bind)”到同名。

目前,我看到一些选项:

  • eval()exec() & Co
  • mutator() 中使用堆栈帧和局部变量
  • 将此类变量保存在 dict 中:不是很方便,但可能是最好的

限制是:目标函数 f() 只能包含一个函数调用,可能带有参数,并且该函数应该能够更改 f() 中的值当前范围。

那么..有没有办法在运行时重新引入变量的值(绑定(bind)另一个对象)?我不相信没有什么好的技巧可以实现这一点!

<小时/>

这是我想要实现的目标的示例:

def view(request): # Yes, that's Django!
q = MyModel.objects.all()

data = { 'some_action': True, 'items_per_page': 50 } # defaults. Mutators can change this
mutators.launch(locals(), data ) # Launch mutators that may want to narrow the QuerySet

if data['some_action']: # do something useful if no mutator has disabled it
...

# paginate using data['items_per_page']

我不想在这里使用 data 字典:将它们修改为局部变量的能力会更好更漂亮。请注意,q QuerySet 对象是可变的,并且修改器可以更改其内容。

最佳答案

class AttributeCollection(object):
pass
shared_settings= AttributeCollection()
# now improvise
shared_settings.temperature= 30
shared_settings.samples= []
# etc

传递shared_settings,或者将其设置为全局,并将其属性设置为您想要的任何内容。

你看,函数的 locals() 只是一个命名空间,旨在(并对其进行优化)在该函数内部(以及该函数运行时)进行操作。使用另一个命名空间(我的建议是 shared_settings 对象)作为代码的公共(public) Playground 。

关于python - 如何修改另一个作用域的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4444498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com