'Open the `.data` file to fetch its metadata, and fetch the metadata
from fast-POST `.meta` files as well if any exist, merging them
properly.
:param data_file: on-disk `.data` file being considered
:param meta_file: on-disk fast-POST `.meta` file being considered
:param ctype_file: on-disk fast-POST `.meta` file being considered that
contains content-type and content-type timestamp
:returns: an opened data file pointer
:raises DiskFileError: various exceptions from
:func:`swift.obj.diskfile.DiskFile._verify_data_file`'

def _construct_from_data_file(self, data_file, meta_file, ctype_file, **kwargs):

    fp = open(data_file, 'rb')
    self._datafile_metadata = self._failsafe_read_metadata(fp, data_file)
    self._metadata = {}
    if meta_file:
        self._metafile_metadata = self._failsafe_read_metadata(meta_file, meta_file)
        if (ctype_file and (ctype_file != meta_file)):
            self._merge_content_type_metadata(ctype_file)
        sys_metadata = dict([(key, val) for (key, val) in self._datafile_metadata.items() if ((key.lower() in DATAFILE_SYSTEM_META) or is_sys_meta('object', key))])
        self._metadata.update(self._metafile_metadata)
        self._metadata.update(sys_metadata)
        self._metafile_metadata.pop('name', None)
        if (('Content-Type' in self._datafile_metadata) and (self.data_timestamp > self._metafile_metadata.get('Content-Type-Timestamp'))):
            self._metadata['Content-Type'] = self._datafile_metadata['Content-Type']
            self._metadata.pop('Content-Type-Timestamp', None)
    else:
        self._metadata.update(self._datafile_metadata)
    if (self._name is None):
        self._name = self._metadata['name']
        self._verify_name_matches_hash(data_file)
    self._verify_data_file(data_file, fp)
    return fp
