I'm writing a program that takes a permutations "model" of strings, and outputs all permutations according to that model. The model looks something like this:
model = Mix([
    [
        "this",
        PickOne(["is", "isn't"])
    ],
    PickOne([
        Mix([
            "absolutely",
            "great"
        ])
    ])
])
Within the outputted permutations,
- listobjects will output the containing objects in sequence
- Mixobjects will output the containing objects in every possible order with ever possible max length (including zero)
- PickOneobjects will output only one of its containing objects at a time
So, the desired output of the above example would be:
[
    ["this", "is"],
    ["this", "isn't"],
    ["this", "is", "absolutely"],
    ["this", "is", "great"],
    ["this", "isn't", "absolutely"],
    ["this", "isn't", "great"],
    ["absolutely"],
    ["great"],
    ["absolutely", "this", "is"],
    ["great", "this", "is"],
    ["absolutely", "this", "isn't"],
    ["great", "this", "isn't"],
    []
]
So far, I've implemented the permutations for the Mix class like this:
class Mix(list):
    def __init__(self, *args, **kwargs):
        super(Mix, self).__init__(*args, **kwargs)
        self.permutations = []
        for L in range(0, len(self)+1):
            for subset in itertools.combinations(self, L):
                subset_permutations = itertools.permutations(subset)
                self.permutations.extend(subset_permutations)
and my PickOne class is simply this
class PickOne(list):
    pass
which I'm planning on just testing for in my main function and handling accordingly (if type(obj) is PickOne: ...).
itertools provides simplification and efficiency for simpler use-cases, however I'm at a loss on how it will help me for this implementation (beyond what I already implemented in Mix). Any ideas of how itertools can be used to help in a Pythonic implementation of the above?
 
    