0

このPythonコードスニペットでは:

def get_something():
    return something

def do_staff():
    value = get_something()
    doit(value)

def test():
    # ?????
    doStaff()

get_something呼び出されたかどうかに応じて返される値を変更する最良の方法は何test or notですか?唯一の制限は、変更したくないということですdo_staff

4

2 に答える 2

2

あなたが尋ねた質問に答える

関数の動作を変更するには、オプションの引数が必要です。これは、のオプションの引数do_staff必要であることを意味します。ここでの本当の問題は、get_somethingどこdo_staffから(testまたは他の場所で)呼び出されたかを知る方法です。

def get_something(test=False):
    if test:
        return something + test_var
    return something

def do_staff(test=False):
    value = get_something(test=test)
    return doit(value)

def test():
    return do_staff(test=True)

do_staffコメントで誰かが述べたように、本当に本当に何らかの理由で変更を嫌う場合は、スタックを調べてテストメソッドがそこにあるかどうかを確認する必要がありますが、それはすぐに醜くなります。それ以外の場合、関数がどのように呼び出されたかを知る唯一の方法は、インジケーターを通過させることです。

実際にあなたの問題を解決する

ただし、コンテキストから、あなたが本当に望んでいるのは、テスト/本番環境間であまり多くのコードを変更することなく、このことをテストする方法を知ることだと思います。その場合は、まったく異なるアプローチをお勧めします。特定の場所から呼び出されたかどうかを確認するのではなく、is_debug_on変数を定義/インポートしてそれを使用するだけです。

is_debug_on = False

def get_something():
    if is_debug_on:
        pass # Do testing stuff, print statements, etc.
    return something # Do normal stuff.

def do_staff():
    value = get_something()

def test():
    is_debug_on = True
    do_staff()
    is_debug_on = False

logging明らかに、すべてをクラス内に配置したり、パッケージを使用したりすることができれば、これはよりクリーンですが、これが基本的な考え方です。この方法ですべてのコードをテストでき、デバッグモードがオフになるため、本番環境に移行するときに何も削除する必要はありません。ボーナス:本番環境で問題が発生した場合は、デバッグをオンに戻して、(うまくいけば)すぐに役立つ情報を入手できます。

于 2013-03-12T16:07:46.080 に答える
1

オプションの引数?

def get_something(from_test=False):
    if from_test:
        return something_test
    else:
        return something

def test():
    get_something(True)
于 2013-03-12T15:59:09.353 に答える