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

4 投票
3 回答
2756 浏览
提问于 2025-04-17 02:13

我需要处理一些类似但各自调用的函数,从一个方法里调用它们。比如说(可能这个例子不是特别好)

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() 的返回值是我想要在这里展示的。我有一堆独立的子调用需要执行,我需要把它们整理成可以返回的东西。

把这些子调用放进一个工具类的成员变量里会不会更简单?这样调用 u.call_method() 的人只需要知道该找什么就行了?

在有人抱怨设计之前,先说明一下,这个设计不是我做的。我只是需要提供一个一致的接口,也想听听大家对如何处理这样的返回值的看法。这种情况不容易标准化,虽然缺少结尾的返回值在运行时不会出错,但开头的返回值就会出问题。

任何建议都非常感谢!谢谢。

3 个回答

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 是一种非常符合 Python 风格的方式,用来返回“没有名字”的元组。

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

这样,调用这个元组的地方就不需要提取所有的元组成员,如果只需要读取其中的一部分就可以了。

2

如果你需要经常把几个值放在一起,一个常用的方法就是使用字典...也就是说,你可以把代码改成:

...
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

撰写回答