2013-01-01 95 views
-3

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

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() 
+0

这是什么意思*圣洁*在这里?我真的不明白你的问题是什么。 'func3()'改变列表吗?如果不是,那么再做一次(或者做一次,让'func2'将它们作为可选参数,如果计算是征税的话)。如果有,请考虑不要这样做 - 如果需要的话,通过复制。 –

+0

@Lattyware - 那么,func2的目的将被破坏..我需要调用func2有时没有必要调用func3里面,在这种情况下,我不能返回list3,列表4 – user1927233

+0

那么为什么不调用'func3()'在'FUNC1()'? –

回答

3

我不确定你的意思是“我不想从func2返回它们,因为它影响到func2的神圣性”,但我假设你的意思是func有一个明显的API,并且这会打破API。

尽管如此,如果你想让来电者能够使用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叫,即使有其他箱子它可能不是,你想要上面的包装函数解决方案。

或者,你甚至可以不返回值 - 没有规则说你的返回值总是必须有相同数量的组件。这几乎肯定会导致你的可读性问题,在未来,但它是完全合法的:

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

如果调用函数知道在什么时候2 list小号比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 
1

如果你想要它,你需要返回它。唯一的其他选择是全球性的,甚至更丑陋。

根据某些条件,显然可以返回不同的值(甚至是不同大小或不同类型的元组)。为此,请使用if。但是,这样做通常很难看,因为调用该函数时通常需要额外的代码。例如,如果foo()返回的东西不是两个元素的集合,则x, y = foo()将会失败并产生异常。

+0

我不会说这很丑 - 这取决于它将如何使用。如果调用者会遍历元组,那么它根本就不是问题。 –

+0

没错,但是你很可能不会'返回x,y',而是'返回some_collection'。在'return x,y'情况下,调用者希望能够使用拆包作业的机会是很好的。 – ThiefMaster

+0

确实,但我想我会提及以防万一。 –

1

所以,如果我理解正确的话,你想func_1能够访问列表1,列表2,项目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的解决方案可能是最干净的利用帮助函数。