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