2012-08-29 1 views
2

가능한 모든 설치 구성을 테스트해야합니다. 구성은 때때로 중첩 배열이 포함 된 사전 배열에 보관됩니다.중첩 된 사전에서 가능한 모든 조합 생성

여기 구성 정보의 샘플입니다 (실제 구성은 더 이상) :

config = {'database': 'sqlite', 
      'useExisting': False, 
      'userCredentials': {'authType': 'windows', 
           'user': r'.\Testing', 
           'password': 'testing' 
          } 
     } 

database를 들어, 옵션 ['sqlite','mysql','oracle']을, 그리고 useExisting를 들어, 옵션 [True, False]이다. 나는 그 모든 순열을 통과하는 방법을 알아낼 수있다.

그러나 userCredentials의 경우 옵션이 매우 다를 수 있습니다. authTypedatabase 인 경우 추가 매개 변수가 필요합니다. 루프를 만들고 모든 유효한 조합을 만드는 함수를 만들 수 있지만 어떻게 결합합니까? 또는 구성을 생성하는 더 좋은 방법이 있습니까?

userCredentials도 다른 설정을 가질 수 있습니다. 예를 들어, testing1과 testing2라는 두 개의 사용자 계정이 있습니다. 두 사용자 계정으로 테스트를 실행해야하며 가능하면 모든 가능한 구성으로 테스트를 실행해야합니다. 이런 식으로 중첩 될 때 모든 구성을 재귀 적으로 생성하는 방법을 찾는 데 어려움을 겪고 있습니다.

+0

확실하지 않지만 Itertools를 확인하십시오. 아마도 뭔가를 찾을 수 있습니다. http://docs.python.org/library/itertools.html – TankorSmash

+0

@TankorSmash, itertools를 살펴 보았습니다. 그것으로 중첩 된 것이 없으면 모든 가능한 조합을 생성 할 수 있지만, 직접 필요한 사전을 생성하는 방법은 없습니다. – Andrew

답변

3

이 제품을 찾고 계 시나요? intertools.product을 사용하여 나열된 데이터베이스, useExisting 및 authType의 모든 조합을 빌드합니다. authType이 'database'이면 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 
+0

이것은 잘 작동하는 것 같습니다! 내가 원래의 질문에서 잘 설명하지 못했다는 것을 깨달았습니다 (그리고 나는 그것을 편집하기 위해 편집 할 것입니다). 또한'config' 내부에 다른 순열을 넣을 필요가 있습니다. 예를 들어,'userCredentials'는'testing1' 사용자와'testing2' 사용자를 사용할 수 있습니다. 나는 itertools.product를 다시 사용할 수있을 것이라고 생각하지만 itertools를 사용하여 재귀 적으로 어떻게 작동하는지 알아 내려고 노력하고있다. – Andrew

+0

사용자/비밀번호 순열로 업데이트되었습니다. 올바른 사용자와 올바른 암호를 유지하는 방법에 유의하십시오. 사용자와 암호를 순차적으로 바꾸고 싶지는 않을 것입니다. –

+0

내가 찾고 있던 코드와 훨씬 더 깨끗한 코드를 생각해 냈습니다. 고마워, 마크! – Andrew