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

时间:2016-10-13 14:21:32

标签: python function arguments global-variables

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

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)
    ...

看起来很糟糕。请帮我找到更优雅的方式。

4 个答案:

答案 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