Python 在嵌套字典中生成所有可能的组合
我需要测试所有可能的安装配置。配置保存在字典数组中,该数组有时包含嵌套数组 以下是配置信息示例(实际配置要长得多): 对于Python 在嵌套字典中生成所有可能的组合,python,testing,itertools,Python,Testing,Itertools,我需要测试所有可能的安装配置。配置保存在字典数组中,该数组有时包含嵌套数组 以下是配置信息示例(实际配置要长得多): 对于数据库,选项是['sqlite'、'mysql'、'oracle'],对于使用现有的,选项是[True,False]。我能想出如何处理所有的排列 但是对于用户凭据,选项可能会大不相同。如果authType是database,我需要额外的参数。我可以创建一个将循环并创建所有有效组合的函数,但是我如何连接它们呢?还是有更好的方法生成配置 userCredentials也可能有不同
数据库
,选项是['sqlite'、'mysql'、'oracle']
,对于使用现有的
,选项是[True,False]
。我能想出如何处理所有的排列
但是对于用户凭据
,选项可能会大不相同。如果authType
是database
,我需要额外的参数。我可以创建一个将循环并创建所有有效组合的函数,但是我如何连接它们呢?还是有更好的方法生成配置
userCredentials
也可能有不同的设置。例如,我有两个用户帐户,testing1和testing2。我需要使用两个用户帐户运行测试,最好是使用所有可能的配置。我很难弄清楚当它像这样嵌套时,如何递归地生成所有配置。这就是您想要的吗?它构建使用列出的数据库、useExisting和authType的所有组合。如果authType为“数据库”,它将使用其他参数更新userCredentials。根据需要修改:
from itertools import product
def build_config(db,flag,authType,userPass):
config = dict(database=db,useExisting=flag)
config['userCredentials'] = {
'authType': authType,
'user': userPass[0],
'password': userPass[1]
}
if authType == 'database':
config['userCredentials'].update(
dict(extra=1,param=2))
return config
database = ['sqlite','mysql','oracle']
useExisting = [True, False]
authType = ['windows','database']
userPass = [('testing1','pass1'),('testing2','pass2')]
for options in product(database,useExisting,authType,userPass):
config = build_config(*options)
print config
我不确定,但是看看Itertools,也许你会发现一些东西@TankorSmash,我调查过itertools。有了它,如果我没有嵌套任何东西,我就能够生成所有可能的组合,但我看不到一种方法可以使用它直接生成我需要的词典。这似乎很有效!有一件事我意识到我在最初的问题中没有很好地解释(我将对其进行编辑以进行更新);我还需要在
config
中有不同的项目排列。例如,userCredentials
可以使用testing1
用户和testing2
用户。我可以想象我可以再次使用itertools.product
,但我正在努力弄清楚如何使用itertools
。通过用户/密码排列进行更新。请注意它是如何为正确的用户保留正确的密码的。你不想在用户和密码上做任何改动。这正是我所要寻找的,也是我当时想出的更干净的代码。谢谢你,马克!
from itertools import product
def build_config(db,flag,authType,userPass):
config = dict(database=db,useExisting=flag)
config['userCredentials'] = {
'authType': authType,
'user': userPass[0],
'password': userPass[1]
}
if authType == 'database':
config['userCredentials'].update(
dict(extra=1,param=2))
return config
database = ['sqlite','mysql','oracle']
useExisting = [True, False]
authType = ['windows','database']
userPass = [('testing1','pass1'),('testing2','pass2')]
for options in product(database,useExisting,authType,userPass):
config = build_config(*options)
print config