It seems compose class could be converted to a function and use the initialization arguments as named arguments for the function instead.
Also the class name does not follow the default PEP 8 class naming CapWords convention (although PEP 8 does accept classes that are mainly used as callables to use the function naming convention). For regular Python users this can be confusing.