<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _load(self, path='config', filetype=None, relaxed=False, ignore=False):
 """ load key value pairs from a file Parameters: path - path to configuration data (see Note 1) filetype - type component of dot-delimited path relaxed - if True, define keys on the fly (see Note 2) ignore - if True, ignore undefined keys in path Return: self Notes: 1. The path can be: * an open file object with a readlines method * a dot delimited path to a file (see normalize_path) * an os-specific path to a file (relative to cwd) * an iterable of key=value strings 2. Normally keys read from the file must conform to keys previously defined for the Config. If the relaxed flag is True, any keys found in the file will be accepted. If the ignore flag is True, and kyes found in the file that are not previously defined are ignored. """

        for num, line in enumerate(
                    un_comment(load_lines_from_path(path, filetype)),
                    start=1,
                ):
            if not line:
                continue
            try:
                key, val = line.split('=', 1)
                key = key.strip()
                val = val.strip()
                if relaxed:
                    self._define(key)
                try:
                    level, itemname = self.__lookup(key)
                except KeyError:
                    if ignore:
                        continue
                    raise
                item = level.get(itemname)
                if item is None:
                    raise KeyError(itemname)
                item.load(val)
            except Exception as e:
                args = e.args or ('',)
                msg = 'line {} of config: {}'. format(num, args[0])
                e.args = (msg,) + args[1:]
                raise
        return self