我不确定你的意思是“我不想从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
需要有list3
和list4
无论什么......那么你必须弄清楚什么样的价值观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
这是什么意思*圣洁*在这里?我真的不明白你的问题是什么。 'func3()'改变列表吗?如果不是,那么再做一次(或者做一次,让'func2'将它们作为可选参数,如果计算是征税的话)。如果有,请考虑不要这样做 - 如果需要的话,通过复制。 –
@Lattyware - 那么,func2的目的将被破坏..我需要调用func2有时没有必要调用func3里面,在这种情况下,我不能返回list3,列表4 – user1927233
那么为什么不调用'func3()'在'FUNC1()'? –