Currectly,我想以下幾點:有些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
具有相同的名稱。
目前,我看到一些選項:
eval()
,exec()
&有限公司- 播放與堆棧幀
mutator()
- &局部變量保持這樣的變量在
dict
:不是很方便,但可能是最好的一個
限制是:target fu 只能包含一個函數調用,可能帶有參數,並且該函數應該能夠更改f()
的當前作用域中的值。
所以..有沒有辦法在運行時重新引入變量的值(綁定另一個對象)?我不相信有沒有好的竅門來實現這一點!
這裏的東西我想實現一個例子:我不想在這裏使用data
字典
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']
:修改這些局部變量會好得多&能力漂亮。請注意,q
QuerySet對象是可變的& mutators可以更改其內容。
需要更多格式。縮進方法體。 – Robert 2010-12-14 21:41:15
你究竟想要完成什麼? – Falmarri 2010-12-14 21:42:03
這將成爲運行時外部調整函數內部邏輯的一種方式,所以可以這麼說:)就像開關某些布爾值開啓和關閉以啓用/禁用特性,將一些「列表」縮小到子集等等。我確信這是實現高度可定製系統的良好調優和擴展框架的最佳方式。 – kolypto 2010-12-14 21:44:05