Python:将变量传递给多个函数调用的好方法



下一种情况需要帮助。我想通过在函数中打印具有命令执行名称和运行时间的小完成报告来实现脚本中的调试模式,如:

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.py
isDebug 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

相关内容

  • 没有找到相关文章

最新更新