2010-12-14 47 views
1

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可以更改其內容。

+0

需要更多格式。縮進方法體。 – Robert 2010-12-14 21:41:15

+6

你究竟想要完成什麼? – Falmarri 2010-12-14 21:42:03

+0

這將成爲運行時外部調整函數內部邏輯的一種方式,所以可以這麼說:)就像開關某些布爾值開啓和關閉以啓用/禁用特性,將一些「列表」縮小到子集等等。我確信這是實現高度可定製系統的良好調優和擴展框架的最佳方式。 – kolypto 2010-12-14 21:44:05

回答

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

傳遞shared_settings周圍,或使其全球,並設置其屬性,無論你的願望。

你會發現,函數的locals()只是一個名字空間(並且對其進行了優化),以便在該函數內部(以及該函數運行時)進行操作。使用另一個命名空間(在我的建議中,shared_settings對象)作爲代碼的常用操場。

+2

+1封裝類中的所有內容。考慮將一個blob中的局部變量發送給其他人讓我感到不安。 – spade78 2010-12-15 02:31:59

+0

只是一件事:是否有理由實例化一個類而不是僅僅使用'dict'?我們只會使用它的'__dict__'屬性 – kolypto 2010-12-15 06:11:11

+1

@o_O:實例化一個類允許你使用點符號來訪問屬性;如果你打算使用getitem符號,一定要使用字典。 – tzot 2010-12-15 08:58:59

0

這樣來做:

def mutator(l): 
    l.append(10) 
    return 10 

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

f() 

是的,我知道這是不是你想要的聰明的黑客;但它的工作原理。 :-)

如果你想一套,你可以打開和調整全局配置選項,堅持所有的人都在對象上:

class Settings(object): 
    def __init__(self): 
     self.n = 1 
     self.l = [1] 

現在你可以改變的變量,你的心內容。

+0

:)))很好!但是當我需要返回多個值時,這看起來不太好。恕我直言,最好使用單個詞典:'self.n'將使用'self .__ dict__'無論如何 – kolypto 2010-12-14 22:25:15

+1

...爲什麼你需要返回多個值?他們都在綁定在設置! :) – 2010-12-15 00:23:27

相關問題