如何 return 来自 Python 函数的多个值的不同计数
How to return different count of multiple values from Python function
我有遗留的 class 层次结构,我想用具有不同方法签名的新 class 来扩展它:覆盖的方法应该 return 树值而不是两个。遗留 classes 的第三个 return 值应该是一些默认值。下面的示例 (repl.it).
class BaseClass:
def do_work(self):
param1, param2, param3 = self.get_params()
self._process(param1, param2, param3)
def get_params(self):
# this method shoud be overrided in the child class
raise NotImplementedError()
def _process(self, param1, param2, param3):
# do some process, for example, print params
print(param1, param2, param3)
class LegacyChild(BaseClass):
def get_params(self):
return 1, 2, 3
class NewChild(BaseClass):
def get_params(self):
return 1, 2
legacy_child = LegacyChild()
legacy_child.do_work()
new_child = NewChild()
new_child.do_work()
在这种情况下,我在第三行得到 ValueError: not enough values to unpack (expected 3, got 2)
。这是正确的。
我首先想到解决这个问题是将硬编码的三个参数更改为可变长度的元组,然后根据它的长度设置 param1
、param2
和 param3
:
class BaseClass:
def do_work(self):
params = self.get_params()
if len(params) == 3:
param1, param2, param3 = params
else:
param1, param2 = params
param3 = 3 # some default value
self._process(param1, param2, param3)
def get_params(self):
# this method shoud be overrided in the child class
raise NotImplementedError()
def _process(self, param1, param2, param3):
# do some process, for example, print params
print(param1, param2, param3)
我认为这个解决方案太粗糙了(repl.it)。
这个问题还有其他可能的解决方案吗?
也许是这个?
param1, param2, *param3 = self.get_params() # param3 is an array. When there are only 2 elements, it's empty.
self._process(param1, param2, (param3 or [3])[0]) # 3 is the default value
这是假设 get_params
总是会产生 2 或 3 个元素。它不能轻易扩展以处理 return 只有一个元素的方法。
我有遗留的 class 层次结构,我想用具有不同方法签名的新 class 来扩展它:覆盖的方法应该 return 树值而不是两个。遗留 classes 的第三个 return 值应该是一些默认值。下面的示例 (repl.it).
class BaseClass:
def do_work(self):
param1, param2, param3 = self.get_params()
self._process(param1, param2, param3)
def get_params(self):
# this method shoud be overrided in the child class
raise NotImplementedError()
def _process(self, param1, param2, param3):
# do some process, for example, print params
print(param1, param2, param3)
class LegacyChild(BaseClass):
def get_params(self):
return 1, 2, 3
class NewChild(BaseClass):
def get_params(self):
return 1, 2
legacy_child = LegacyChild()
legacy_child.do_work()
new_child = NewChild()
new_child.do_work()
在这种情况下,我在第三行得到 ValueError: not enough values to unpack (expected 3, got 2)
。这是正确的。
我首先想到解决这个问题是将硬编码的三个参数更改为可变长度的元组,然后根据它的长度设置 param1
、param2
和 param3
:
class BaseClass:
def do_work(self):
params = self.get_params()
if len(params) == 3:
param1, param2, param3 = params
else:
param1, param2 = params
param3 = 3 # some default value
self._process(param1, param2, param3)
def get_params(self):
# this method shoud be overrided in the child class
raise NotImplementedError()
def _process(self, param1, param2, param3):
# do some process, for example, print params
print(param1, param2, param3)
我认为这个解决方案太粗糙了(repl.it)。
这个问题还有其他可能的解决方案吗?
也许是这个?
param1, param2, *param3 = self.get_params() # param3 is an array. When there are only 2 elements, it's empty.
self._process(param1, param2, (param3 or [3])[0]) # 3 is the default value
这是假设 get_params
总是会产生 2 或 3 个元素。它不能轻易扩展以处理 return 只有一个元素的方法。