2

我不确定在 Python 中这样的事情是否可能,但如果是的话,它会非常有用(至少在这种情况下对我来说)。

我有一个测试框架,我想在其中将测试配置与测试命令分开。这很有用,因为它允许您混合和匹配配置/测试,而无需实际修改任何代码。我本质上只是一个简短的运行脚本,它采用配置模块和测试模块的名称,然后加载并运行两者,如下所示:

config = __import__(configmod)
test = __import__(commandsmod)

config.run(test.commands)

唯一的问题是我实际上希望测试脚本对配置参数有一些有限的认识。理想情况下,我希望能够在 test/commands 模块中执行以下操作:

command1 = MyCommand(arg1, arg2, LazyArg1())
command2 = MyCommand(arg1, arg2, LazyArg2())
commands = [command1, command2]

其中 LazyArg1 和 LazyArg2 是在配置模块(或导入两个配置/命令的运行器模块)中定义的方法。有什么方法可以延迟对这些函数的评估,直到它们被实际定义?

我也愿意接受其他方式来达到同样的目的。我唯一的另一个想法是让配置模块将字典写入文件,然后让命令模块导入它(假设你只是写出repr(mydict))。这不是很吸引人..虽然它会起作用。

4

2 回答 2

1

Python 是动态类型的,所以这没什么特别的:

configMod.py:

##### 这是configMod.py #####
modTestArg1 = "布赖恩"

def runTest(testMod, *args, **kwargs):
    testMod.doTest(*args, **kwargs)

测试模块.py:

##### 这是 testMod.py #####
def doTest(name, address, city="San Francisco"):
    print "doTest 调用名称:%s,地址:%s,城市:%s" % \
        (姓名、地址、城市)

控制模块.py

##### 这是 controlMod.py #####
导入配置模块
导入测试模块

configMod.runTest(testMod, configMod.modTestArg1, "123 Fake Street")

运行:

python controlMod.py
doTest 名称:Brian,地址:123 Fake Street,城市:旧金山
于 2010-02-08T19:44:47.557 回答
0

我讨厌回答自己的问题,但经过深思熟虑后,我想出了一个潜在的解决方案(尽管我很想听听其他想法)。

假设我们有一个模块 mod1:

def myfunc(z):
    return z

和一个模块 mod2:

x = lambda mod: mod.myfunc

您现在可以在第三个模块中执行以下操作:

import mod1
from mod2 import *

x(mod1)(5)

你最终打电话给mod1's myfunc。如果双重函数调用看起来令人困惑,您可以分配x(mod1)给另一个变量名。

于 2010-02-08T17:42:01.900 回答