繁体   English   中英

如何从 Python function 返回多个值的不同计数

[英]How to return different count of multiple values from Python function

我有遗留的 class 层次结构,我想用新的 class 扩展它,方法签名不同:覆盖的方法应该返回树值而不是两个。 遗留类的第三个返回值应该是一些默认值。 下面的例子( 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) 这是正确的。

解决这个问题的第一个想法是将硬编码的三个参数更改为可变长度的元组,然后根据它的长度设置param1param2param3

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 个元素。 它不能轻易扩展以处理只返回一个元素的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM