下一种情况需要帮助。我想通过在函数中打印具有命令执行名称和运行时间的小完成报告来实现脚本中的调试模式,如:
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变量被简单地传递给函数?我应该使用"全局isDebug"吗?
因为 ...
cmd_exec(cmd1, isDebug)
...
cmd_exec(cmd2, isDebug)
...
看起来很糟糕。
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)
Python有一个内置的__debug__
变量,这可能很有用。
if __debug__:
print 'information...'
当您运行您的程序作为python test.py
, __debug__
是True
。如果您以python -O test.py
的身份运行它,它将是False
。
我在项目中做的另一个选项是在导入后在文件开头设置全局DEBUG
变量:
DEBUG = True
你可以在函数的作用域中引用这个DEBUG
变量
您可以使用模块来创建共享的变量。这比全局名称空间要好,因为它只影响专门寻找变量的代码,它不会污染全局名称空间。它还允许你定义一些东西,而不需要你的主模块知道它。
这样做是因为模块在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
具体来说,我会使用偏导数/柯里化,基本上是预填充一个变量。
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 testrongo64.pyisDebug is falsecmd1
isDebug is falsecmd2
jluc@explore py testrongo64.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