2013-04-11 83 views
0

據我所知,python中沒有引用int s或float或類似的數據。不過,我對一個問題的工作哪裏會是對我來說非常方便,如果我可以做類似python引用float,int等

a=1 
b=2 
c=3 
ref_dict={'field1':ref_to_var_a,'field2':ref_to_var_b,'field3':ref_to_var_c} 

然後

def update(field,value): 
    ref_dict[field]=value 

所以,如果用戶調用

update('field2',5) 

b的值將變爲5.

有沒有什麼辦法可以做到這一點?謝謝。

爲了迴應arbanert的有用評論和回答,我真正想要做的是 - 驚喜,驚喜 - 更復雜。我正在用wxPython構建一個GUI。我有很多TextCtrl控件,每個控件都會設置一個變量的值。當然,我可以寫一個方法爲每個控件,或者我可以寫一個方法,它會看起來像

def handleTextEvent(self,event): 
    if (event.GetEventObject() == widget1): 
     a=int(event.GetString) 
    elif (event.GetEventObject() == widget2): 
     b= .... 

我想你可以看到,爲什麼我不喜歡這樣。這將是很好,如果我可以只是做一個簡短的功能,如:

def handleTextEvent(self,event): 
    ref_dict[event.GetEventObject()]=int(event.GetString()) 

而且,是的,我很新的wxPython用。

謝謝!

+3

如果您證明了爲什麼這樣做會很方便,那麼回答會更容易 - 因爲答案可能是「您並不真的想這樣做」。 – abarnert

+1

重點是強迫你從合理的數據結構開始 - 如果你真的想寫這個代碼,它會看起來像'structure.update('field',5)' –

+0

@JochenRitzel:+1。但是'structure.field = 5'在大多數情況下更好...... – abarnert

回答

2

可能,但它幾乎總是一個壞主意。

假設abc是全局:

ref_dict = {'field1': 'a', 'field2': 'b', 'field3': 'c'} 
def update(field, value): 
    globals()[ref_dict[field]] = value 

如果你真的想,你甚至可以創建 「引用包裝」:

class GlobalReference(object): 
    def __init__(self, name): 
     self.name = name 
    def get(self): 
     return globals()[self.name] 
    def set(self, value): 
     globals()[self.name] = value 

ref_dict = {'field1': GlobalReference('a'), 'field2': GlobalReference('b')} 
def update(field, value): 
    ref_dict[field].set(value) 

如果你想包裝不在globals中的東西,比如來自另一個模塊的全局變量,類attribu tes,實例屬性等?創建更多的參考包裝類型:

class NamespaceReference(object): 
    def __init__(self, namespace, name): 
     self.namespace, self.name = namespace, name 
    def get(self): 
     return getattr(self.namespace, self.name) 
    def set(self, value): 
     setattr(self.namespace, self.name, value) 

ref_dict = {'field1': GlobalReference('a'), 'field2': NamespaceReference('myobj', 'b')} 

也可以放棄類,只是店setter函數...


因此,如果這是一個壞主意,什麼是正確的答案?

不知道你想做什麼,這很難說,但這裏有一些可能性:

  • 使用單一dict全可變值,而不是一堆獨立變量的。
  • 製作一個類的變量實例屬性,並傳遞該類的一個實例。
  • 使用可變浮動持有者對象而不是普通浮動實例。

針對您的特殊情況下,我想你想要的是第二個。這是標準的模型 - 視圖 - 控制器設計。或者,如果你不喜歡MVC,model-template-view或其他一些變體(這裏你不需要控制器)。

您的模型是一羣零星的全局變量,這就是爲什麼很難將它與視圖掛鉤的原因。最簡單的答案是將模型表示爲對象。然後給視圖(或其控制器)一個參考這個模型,這是微不足道的,你就完成了。

+0

但是,這個* only *在''a','b'等與'update'在同一模塊中被定義時起作用,所以它仍然不是真正的參考操作。 – mgilson

+0

@mgilson:如果它們是另一個模塊中的全局變量,則執行'setattr(other_module,ref_dict [field],value)'。你可以爲類屬性,實例屬性等做類似的事情。你甚至可以用簡單的GlobalReference,LocalReference,NamespaceReference等類來包裝這些東西,並傳遞它們。 – abarnert