2011-09-13 72 views
3

我需要從一個方法處理一堆類似但唯一調用的函數。例如(也許不是一個很好的例子)Python,返回/處理來自方法的複雜數據的最佳方式

class Util(object): 
    def method1(self): 
     return "method1", [1,2,3] 

    def method2(self): 
     return "method2", {"1":4, "2":5, "3":6} 

    def method3(self): 
     return [1,2,3], "method3", {"1":4, "2":5, "3":6} 

    def call_method(self, method_func): 
     if method_func.__name__ == "method1": 
      (name, dict_values) = self.method_func() 
     if method_func.__name__ == "method2": 
      (name, list_values) = self.method_func() 
     if method_func.__name__ == "method3": 
      (list_values, name, dict_values) = self.method_func() 
     # How best to manage a return for 3 optional, but not inter-dependent values? 
     return name, dict_values, list_values 

if __name__ = "__main__": 
    u = Util() 
    (name, dict_values, list_values) = u.call_method(Util.method1) 

call_method()返回是我想要在這裏可視化。我有一堆我需要做的專屬子通話,我需要將它們按摩到可以返回的東西。

將它們填充到Util類成員變量中會更容易嗎?而實現u.call_method()的人只需要知道要查找什麼?

在任何人首先抱怨設計之前,它不是我的。我只需要公開一個一致的API並且有興趣聽到關於如何處理這種回報的意見。這是不容易規範化的,雖然失蹤的追蹤返回值將通過運行時,但領先的不會。

任何提示將是偉大的!謝謝。

+2

'return name,dict_values,list_values'有什麼問題?我不明白你有什麼問題? –

回答

1

如果需要組值通常的方法是使用字典...即將您的代碼更改爲:

... 
def method1(self): 
    return {"name": "method 1", 
      "list": [1, 2, 3]} 

Python中可能的東西是使用對象而不是字典ionary做出更好的代碼如下:

class Bunch: 
    def __init__(self, **kwargs): 
     self.__dict__.update(kwargs) 

... 
def method1(self): 
    return Bunch(name="method1", 
       list=[1, 2, 3]) 

,使主叫方可以使用result.name而不是result["name"]

最近在Python中標準化的另一個選項是NamedTuple

+0

我喜歡它。感謝您的反饋。 – garlicman

+0

namedtuple(下面)用一點點乾淨的方式做到這一點,你仍然可以使用類似tuple的解包值 –

+0

你不需要Bunch,你可以使用dict(name =「method」,list = [1,2,3] ) – rocksportrocker

1

如果你可以修改方法:

class Util(object): 
    def method1(self): 
     return "method1", [1,2,3], None 

    def method2(self): 
     return "method2", None, {"1":4, "2":5, "3":6} 

    def method3(self): 
     return "method3", [1,2,3], {"1":4, "2":5, "3":6} 

    def call_method(self, method_func): 
     return method_func(self)  

if __name__ == "__main__": 
    u = Util() 
    (name, dict_values, list_values) = u.call_method(Util.method1) 
    # better: 
    print u.method1() 

如果你不能改變:

class Util(object): 
    def method1(self): 
     return "method1", [1,2,3] 

    def method2(self): 
     return "method2", {"1":4, "2":5, "3":6} 

    def method3(self): 
     return "method3", [1,2,3], {"1":4, "2":5, "3":6} 

    def call_method(self, method_func): 
     results = method_func(self) 
     name = list_ = dict_ = None 
     for obj in results: 
      if isinstance(obj, string): 
       name = obj 
      elif isinstance(obj, list): 
       list_ = obj 
      elif isinstacne(obj, dict): 
       dict_ = obj 
     return name, dict_, list_ 

if __name__ == "__main__": 
    u = Util() 
    (name, dict_values, list_values) = u.call_method(Util.method1) 
3

namedtuple是如果它需要閱讀只是其中的一些返回「無名」的元組

http://docs.python.org/library/collections.html#collections.namedtuple

這樣,調用者不需要提取所有元組成員非常Python的替代品。

+0

+1對於namedtuples!在返回元組的任何地方,改變你的代碼來返回一個namedtuple。做到這一點。 – jathanism

+0

唯一與namedtuples混淆的是固定字段集。沒有明顯的方法來將非設置字段默認爲None或其他。例如在一種情況下,只有3個領域中的2個可用於人羣,在另一個情況下,3個領域中的3個可用。您必須始終填充namedtuple中定義的所有字段。如果我可以在構建namedtuple時爲缺少的字段設置默認值,那將會非常棒。 – garlicman

+0

Python沒有爲此目的:)但文檔聲稱你可以創建自己的namedtuple實現(子類),它將所有值初始化爲None。 –

相關問題