'Constructs a `Pipeline` object.
Subclass constructors are expected to call this constructor.
A type signature is a Python class or primative collection containing
classes. Valid type signatures for `Pipeline` inputs and outputs are either
a Python class, or a dictionary mapping string names to classes. An object
matches a type signature if its type equals the type signature
(i.e. type(\'hello\') == str) or, if its a collection, the types in the
collection match (i.e. {\'hello\': \'world\', \'number\': 1234} matches type
signature {\'hello\': str, \'number\': int})
`Pipeline` instances have (preferably unique) string names. These names act
as name spaces for the Statistics produced by them. The `get_stats` method
will automatically prepend `name` to all of the Statistics names before
returning them.
Args:
input_type: The type signature this pipeline expects for its inputs.
output_type: The type signature this pipeline promises its outputs will
have.
name: The string name for this instance. This name is accessible through
the `name` property. Names should be unique across `Pipeline`
instances. If None (default), the string name of the implementing
subclass is used.'

def __init__(self, input_type, output_type, name=None):

    if (name is None):
        self._name = type(self).__name__
    else:
        assert isinstance(name, six.string_types)
        self._name = name
    _assert_valid_type_signature(input_type, 'input_type')
    _assert_valid_type_signature(output_type, 'output_type')
    self._input_type = input_type
    self._output_type = output_type
    self._stats = []
