-3

我在下面的程序流程中遇到了这个问题,其中 func1 需要 list3,list4 但我不想从 func2 返回它们,因为它会影响 func2 的神圣性,有没有一种方法可以根据某些条件返回?全局是一种方式,但是这对我不起作用,因为我将使用不同的值调用这些函数,返回的列表取决于对值执行的操作..我还有哪些其他选项?

def func3 (value):
    list3=[]
    list4=[]
    #do some operations based on value
    return list3,list4

def func2 (value,flag):
    list1=[]
    list2=[]
    value=10
    #do some operations based on value
    if flag:
        (list3,list4)=func3(value)
    return list1,list2

def func1() :
    value =20
    (list1,list2)= func2(value,1)
    #func1 needs list3 and list4

def main():
    func1()

if __name__ == '__main__':
    main()
4

3 回答 3

3

我不确定您所说的“我不想从 func2 返回它们,因为它会影响 func2 的神圣性”是什么意思,但我假设您的意思是它func有一个明显的 API,这会破坏该 API。

不过,如果您希望调用者能够使用 of 中的这些值,则必须以某种func2方式将它们传递出去。以下是一些替代方案:

# Internal function used by func2 and func1
def func2_(value):
    list1=[]
    list2=[]
    value=10
    #do some operations based on value
    (list3,list4)=func3(value)
    return list1, list2, list3, list4

# Real func2 with the desired public API
def func2(value):
    list1, list2, _, _ = func2_(value)
    return list1, list2

def func1() :
    value =20
    (list1,list2,list3,list4)= func2_(value)
    #func1 _has_ list3 and list4

如果问题是func2有时调用func3,有时不调用,但func1总是需要拥有list3list4无论如何......那么你必须弄清楚如果从不调用func1 应该func3得到什么值,然后返回那个值。明显的选择是[],None或调用者传入的默认值:

def func2():
    list1=[]
    list2=[]
    value=10
    if somePredicate():
        (list3,list4)=func3(value)
        return list1, list2, list3, list4
    else:
        return list1, list2, None, None

如果您确定func2应该始终在调用func3它时调用它func1,即使在其他情况下它可能不是,您也需要上面的 wrapper-function 解决方案。

或者,您甚至可以不返回值——没有规则说您的返回值必须始终具有相同数量的组件。这几乎肯定会在将来给您带来可读性问题,但这是完全合法的:

def func2():
    list1=[]
    list2=[]
    value=10
    if somePredicate():
        (list3,list4)=func3(value)
        return list1, list2, list3, list4
    else:
        return list1, list2

如果调用函数知道什么时候需要 2list秒和 4 秒,那么你有两个不同的函数,所以你需要包装器。但如果它不可预测,他们可以动态处理它:

lists = function2(value)
if len(lists) == 4:
    list1, list2, list3, list4 = lists
    # do stuff will all 4 lists
else:
    list1, list2 = lists
    # do stuff with just 2 lists—or, if you needed the others, complain

或者,如果您有一组数据和一组紧密结合在一起的操作,那么这可能是一个对象的工作:

class Class1(object):
    def __init__(self):
        self.list1, self.list2, self.list3, self.list4 = [], [], [], []
    def func3 (value):
        self.list3=[]
        self.list4=[]
        #do some operations based on value (that presumably modify list3/list4)
    def func2(self, value):
        self.list1=[]
        self.list2=[]
        #do some operations based on value (that presumably modify list1/list2)
        self.func3(value) # this sets self.list3 and self.list4
    def func1(self):
        value =20
        self.func2(value)
        #func1 now has access to the same self.list3 and self.list4 as func2
于 2013-01-01T00:12:33.887 回答
1

如果你想要它,你需要退回它。唯一的其他选择将是一个更加丑陋的全局。

根据某些条件,您显然可以返回不同的值(甚至是不同大小或不同类型的元组)。用于if此。然而,这样做通常是相当难看的,因为它在调用函数时通常需要额外的代码。例如,如果返回的不是两个元素的集合,x, y = foo()则会失败并出现异常。foo()

于 2013-01-01T00:06:09.293 回答
1

因此,如果我理解正确,您希望 func_1 可以访问 list1、list2、list3 和 list4,并且既然您已经在内部调用了 func_3,那么您想在将来使用该调用吗?

一种简单的方法是简单地定义一个辅助函数,如上所述,或者,给 func_2 2 个变量,例如:

def func_2(value, lists_3_4=false):
     list1=[]
     list2=[]
     value=10
     #do some operations based on value
     (list3,list4)=func3(value)
     if lists_3_4:
     return list1, list2, list3, list4 
     return list1,list2

但同样,这可能会破坏你定义为神圣的东西。

在我看来,abarnert 的解决方案可能是最干净的利用辅助函数。

于 2013-01-01T00:25:25.627 回答