import operator
class Set(set):
def __mul__(self, other):
if not isinstance(other, set):
return NotImplemented
return Set(self._join_elements(x, y) for x in self for y in other)
def __pow__(self, amount):
if not isinstance(amount, int):
return NotImplemented
return reduce(operator.mul, (self for _ in xrange(amount)))
def _join_elements(self, x, y):
if not isinstance(x, tuple):
x = (x,)
if not isinstance(y, tuple):
y = (y,)
return x + y
def __repr__(self):
s = set.__repr__(self)
return '%s(%s' % (self.__class__.__name__, s.split('(', 1)[1])
def main():
# binary numbers of 3 bits
s = Set([0, 1])
print s ** 3
if __name__ == '__main__':
main()