Генерация каждой перестановки с уникальными ограничениями - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь создать сценарий тестирования, который будет генерировать каждую возможную перестановку значений в соответствии с несколькими списками.Однако существуют некоторые ограничения на то, какие значения могут быть сопоставлены с другими.До сих пор я придумал следующее:

fieldTypes = ['Text', 'Float', 'Double', 'Short', 'Long', 'Date']
domainTypes = ['Coded', 'Range']
rangeSplitPolicies = ['Default', 'Duplicate', 'Geometry_Ratio']
rangeMergePolicies = ['Default', 'Area_Weighted', 'Sum_Values']
codedSplitPolicies = ['Default', 'Duplicate']
codedMergePolicies = ['Default']

for fieldType in fieldTypes:
    for domainType in domainTypes:
        # Skip incompatible domainType-fieldType permutations
        if domainType == 'Coded' and fieldType == 'Date' \
        or domainType == 'Range' and fieldType == 'Text':
           break

        # Range domain-type handling
        if domainType == 'Range':
            for splitPolicy in rangeSplitPolicies:
                # Date fields require special handling and only support the 
                # the default keyword for their split and merge policies
                if fieldType == 'Date':
                    permutation = '{0}-{1}'.format(
                        fieldType,
                        domainType,
                        'Default',
                        'Default')
                else:
                    for mergePolicy in rangeMergePolicies:
                        permutation = '{0}-{1}-{2}-{3}'.format(
                            fieldType,
                            domainType,
                            splitPolicy,
                            mergePolicy)

        # Coded-value domain-type handling
        else:
            for splitPolicy in codedSplitPolicies:
                for mergePolicy in codedMergePolicies:
                    permutation = '{0}-{1}-{2}-{3}'.format(
                        fieldType,
                        domainType,
                        splitPolicy,
                        mergePolicy)

        # Do more stuff...

Очевидно, это не очень элегантно.Если возможно, я бы хотел использовать Генератор, так как мне нужно будет получать каждую перестановку только один раз, но я действительно не уверен, как лучше организовать это и получить все возможные перестановки field и domainType, а такжесоответствующие политики разделения и слияния для каждого domainType с одновременным применением нюансовых ограничений:

  • Домены на основе кодированных значений не поддерживаются в полях даты
  • Домены на основе диапазонов не поддерживаются в текстовых полях
  • Поля даты поддерживают только ключевое слово «По умолчанию» для своей политики разделения и слияния.

Сейчас я просто получаю перестановку в виде строки, но она может быть возвращена как кортеж, список или все, что легко разбирается.

Заранее благодарим вас за понимание.

1 Ответ

0 голосов
/ 08 июня 2018

Не похоже, что вы действительно имеете в виду перестановки, но декартово произведение.

Подумайте над тем, чтобы сделать что-то вроде следующего:

def gen(domain_types, field_types):
    for d, f in itertools.product(domain_types, field_types):
        if is_okay(d, f):
            yield d, f

Я знаю, у вас есть больше полей для беспокойства, но этого примера должно хватить.

...