7

メイン プログラム (test.py) と、メイン プログラムによって呼び出されるヘルパー関数を持つ小さなユーティリティ プログラム (test_utils.py) があるとします。debug_flag経由で読み込まれるブール値を渡すことで、コード内のデバッグ ステートメントをオンにしたいと思いargparseます。

の値に応じて、プログラム内の関数がtest_utils.pyデバッグ ステートメントも出力するようにしますdebug_flagdebug_flag各関数定義にパラメーターとしていつでも追加してtest_utils.py、関数が呼び出されたときにパラメーターを渡すことができますが debug_flag、グローバル変数を作成するなど、より良い方法はありますか? しかし、debug_flagからグローバルであると 宣言した場合test.py、それはどのようににインポートされ test_utils.pyますか?

ここで最もエレガント/Pythonicなアプローチは何でしょうか?

test.py:

import argparse
from test_utils import summation

def main():
    args = get_args()
    debug_flag = True if args[debug] == 'True' else False
    print summation(5, 6, 7)

def get_args():
    parser = argparse.ArgumentParser(description='Test program')
    parser.add_argument('-d','--debug', help='Debug True/False', default=False)
    args = vars(parser.parse_args())
    return args

test_utils.py:

from test import debug_flag

def summation(x, y, z):
    if debug_flag:
        print 'I am going to add %s %s and %s' % (x, y, z)
    return x + y + z

EDIT1:明確にするために-argparseを介してデバッグフラグを渡し、それによってdebug_flagをTrueに設定した場合-これはどのように内の関数に伝播されますtest_utils.pyか?

EDIT2: @joran-beasley の提案に基づいて、これが私が持っているものです。

test.py:

import argparse
import logging
from test_utils import summation

def main():
    args = get_args()
    logging.getLogger("my_logger").setLevel(logging.DEBUG if args['debug'] == 'True' else logging.WARNING)
    print summation(5, 6, 7)

def get_args():
    parser = argparse.ArgumentParser(description='Test program')
    parser.add_argument('-d','--debug', help='Debug True/False', required=True)
    args = vars(parser.parse_args())
    return args

main()

test_utils.py

import logging

log = logging.getLogger('my_logger')

def summation(x, y, z):
    log.debug('I am going to add %s %s and %s' % (x, y, z))
    return x + y + z

test.py を実行すると、次のようになります。

$ python test.py -d True
No handlers could be found for logger "my_logger"
18
4

3 に答える 3