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() 的返回值是我想要在这里展示的。我有一堆独立的子调用需要执行,我需要把它们整理成可以返回的东西。
把这些子调用放进一个工具类的成员变量里会不会更简单?这样调用 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。