我需要从单个方法处理一堆类似但专门调用的函数。例如(也许不是一个很好的例子)
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,并且有兴趣听取有关如何处理这样的返回的意见。它不容易规范化,虽然缺少尾随返回值将通过运行时,但领先的不会。
任何提示都会很棒!谢谢。
答案 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。