-3

func1がlist3、list4を必要とする以下のプログラムフローでこの問題が発生していますが、func2の神聖さに影響を与えるため、func2からそれらを返したくありません。いくつかの条件に基づいて返す方法はありますか?グローバルは1つの方法ですが、これらの関数を異なる値で呼び出すため、それはうまくいきません。返されるリストは、値に対して実行される操作に依存します..他にどのようなオプションがありますか?

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常に呼び出す必要があると確信している場合は、そうでない可能性がある他のケースがある場合でも、上記のラッパー関数ソリューションが必要です。func3func1

または、単に値を返さないこともできます。戻り値が常に同じ数のコンポーネントを持たなければならないというルールはありません。これはほぼ確実に将来的に可読性の問題を引き起こしますが、完全に合法です:

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
于 2013-01-01T00:12:33.887 に答える
1

欲しいなら返せばいい。他の唯一のオプションは、さらに醜いグローバルです。

いくつかの条件に応じて、明らかに異なる値 (異なるサイズまたは異なる型のタプルでさえ) を返すことができます。これに使用ifします。ただし、関数を呼び出すときに追加のコードが必要になることが多いため、通常はかなり醜いです。たとえば、2 つの要素のコレクションではないものが返さx, y = foo()れると、例外が発生して失敗します。foo()

于 2013-01-01T00:06:09.293 に答える
1

私があなたを正しく理解していれば、func_1 が list1、list2、list3、list4 にアクセスできるようにしたいと考えており、内部で既に func_3 を呼び出していることがわかるので、将来その呼び出しを利用したいですか?

これを行う簡単な方法の 1 つは、上記のように単純にヘルパー関数を定義するか、次のように 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 に答える