在下一个情况下需要帮助。我希望在我的脚本中通过在命令执行名称和耗尽时间的函数中打印小完成报告来实现调试模式,如:
def cmd_exec(cmd):
if isDebug:
commandStart = datetime.datetime.now()
print commandStart
print cmd
...
... exucuting commands
...
if isDebug:
print datetime.datetime.now() - command_start
return
def main():
...
if args.debug:
isDebug = True
...
cmd_exec(cmd1)
...
cmd_exec(cmd2)
...
如何将isDebug变量简单地传递给函数? 我应该使用“global isDebug”吗?
因为
...
cmd_exec(cmd1, isDebug)
...
cmd_exec(cmd2, isDebug)
...
看起来很糟糕。请帮我找到更优雅的方式。
答案 0 :(得分:2)
isDebug
是适用于函数cmd_exec
的应用程序的状态。对我来说听起来像是一个用例的用例。
class CommandExecutor(object):
def __init__(self, debug):
self.debug = debug
def execute(self, cmd):
if self.debug:
commandStart = datetime.datetime.now()
print commandStart
print cmd
...
... executing commands
...
if self.debug:
print datetime.datetime.now() - command_start
def main(args):
ce = CommandExecutor(args.debug)
ce.execute(cmd1)
ce.execute(cmd2)
答案 1 :(得分:2)
Python有一个内置的__debug__
变量可能很有用。
if __debug__:
print 'information...'
以python test.py
运行程序时,__debug__
为True
。如果您将其作为python -O test.py
运行,则为False
。
我在项目中执行的另一个选项是在导入后在文件开头设置全局DEBUG
var:
DEBUG = True
然后,您可以在函数范围内引用此DEBUG
var。
答案 2 :(得分:1)
您可以使用模块创建共享的变量。这比全局更好,因为它只影响专门寻找变量的代码,它不会污染全局命名空间。它还允许您定义某些内容,而无需主模块需要了解它。
这是因为模块是Python中的共享对象。每个import
都会获得对同一对象的引用,并且会立即共享对该模块内容的修改,就像全局一样。
my_debug.py:
isDebug = false
main.py:
import my_debug
def cmd_exec(cmd):
if my_debug.isDebug:
# ...
def main():
# ...
if args.debug:
my_debug.isDebug = True
答案 3 :(得分:0)
特别是对于这个,我会使用partials / currying,基本上预先填充一个变量。
import sys
from functools import partial
import datetime
def _cmd_exec(cmd, isDebug=False):
if isDebug:
command_start = datetime.datetime.now()
print command_start
print cmd
else:
print 'isDebug is false' + cmd
if isDebug:
print datetime.datetime.now() - command_start
return
#default, keeping it as is...
cmd_exec = _cmd_exec
#switch to debug
def debug_on():
global cmd_exec
#pre-apply the isDebug optional param
cmd_exec = partial(_cmd_exec, isDebug=True)
def main():
if "-d" in sys.argv:
debug_on()
cmd_exec("cmd1")
cmd_exec("cmd2")
main()
在这种情况下,我在命令行上检查-d
以打开调试模式,我通过创建一个isDebug = True
的新函数来预先填充函数调用中的isDebug。
我认为即使其他模块也会看到这个修改过的cmd_exec,因为我在模块级别替换了这个函数。
输出:
jluc @ explore $ py test_so64.py
isDebug is falsecmd1
isDebug is falsecmd2
jluc @ explore $ py test_so64.py -d
2016-10-13 17:00:33.523016
cmd1
0:00:00.000682
2016-10-13 17:00:33.523715
cmd2
0:00:00.000009