假设我有一个主程序(test.py)和一个小工具程序(test_utils.py),其中包含由主程序调用的辅助函数。
我想通过传递一个名为“debug_flag”的布尔值来在代码中打开调试语句,该布尔值是通过argparse读取的。
现在,我希望
如何在这里使用最优雅/Pythonic的方法?
test.py:
当我运行test.py时,我得到了以下结果:
现在,我希望
test_utils.py
程序内部的函数也能根据debug_flag
的值打印调试语句。我可以在每个函数定义中添加debug_flag
作为参数,并在调用函数时传递参数,但是否有更好的方法,在此处将debug_flag
设置为全局变量?但是如果我从test.py
声明debug_flag
为全局变量,那么它会被导入到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
编辑1:为了澄清 - 如果我通过argparse传递调试标志,并因此将debug_flag设置为True - 如何将其传播到test_utils.py
中的函数?
编辑2:根据@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
logging
:https://docs.python.org/3.6/library/logging.html - Adonisargs[debug]
是一个错误。而且args.debug
已经包含了一个布尔值。 - Danielglobal debug_flag
添加到main
中会使其成为模块级变量,而不是函数局部变量。 - chepnermatplotlib
中的'rcParams')的项目所做的。事实上,任何可变对象都可以,因此您也可以传递一个list
或dict
。 - tel