def cast_row(self, row, fail_fast=False):
        """https://github.com/frictionlessdata/tableschema-py#schema
        """

        # Prepare
        result = []
        errors = []

        # Check row length
        if len(row) != len(self.fields):
            message = 'Row length %s doesn\'t match fields count %s'
            message = message % (len(row), len(self.fields))
            raise exceptions.CastError(message)

        # Cast row
        for field, value in zip(self.fields, row):
            try:
                result.append(field.cast_value(value))
            except exceptions.CastError as exception:
                if fail_fast:
                    raise
                errors.append(exception)

        # Raise errors
        if errors:
            message = 'There are %s cast errors (see exception.errors)' % len(errors)
            raise exceptions.CastError(message, errors=errors)

        return result
https://github.com/frictionlessdata/tableschema-py#schema