Python,从方法返回/处理复杂数据的最佳方式

时间:2011-09-13 18:03:22

标签: python class data-structures

我需要从单个方法处理一堆类似但专门调用的函数。例如(也许不是一个很好的例子)

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,并且有兴趣听取有关如何处理这样的返回的意见。它不容易规范化,虽然缺少尾随返回值将通过运行时,但领先的不会。

任何提示都会很棒!谢谢。

3 个答案:

答案 0 :(得分:3)

namedtuple是返回“无名”元组的非常Pythonic替代方案

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

这样,如果调用者只需要读取其中的一些元组成员,则不需要提取所有元组成员。

答案 1 :(得分: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)

答案 2 :(得分:1)

如果您需要经常对多个值进行分组,则一种方法是使用字典...即将代码更改为:

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

Python中可能的一点是使用对象而不是字典来使代码更好阅读:

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