「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
常に必要であり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
list
呼び出し元の関数が 2秒と 4 秒をいつ期待するかを知っている場合は、 2 つの異なる関数があるので、ラッパーが必要です。ただし、予測できない場合は、動的に処理できます。
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