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