AttributeError во время загрузки YAML пользовательского класса python - PullRequest
0 голосов
/ 20 апреля 2020

Для небольшого учебного проекта я пытаюсь создать «базу данных» YAML следующим образом:

class Actor:
    def __init__(self, url: str):
        self.url = url

        # Extract First and last name from URL
        _ = url.replace('.htm', '').split('/')[-1].split('-')
        self.last_name = '' if len(_) == 1 else ' '.join(_[1:]).title()
        self.first_name = _[0].title()
        print(f"Actor {self.first_name} {self.last_name} was created...")

   def __repr__(self):
        return self.url

    def __eq__(self, other):
        return self.__repr__() == other.__repr__()

    def __hash__(self):
        return hash(self.url)

class ActorsDB:
    def __init__(self):
        self.db_file = os.path.abspath('actors_db.yml')
        self.candidates = set()
        self.actors = set()
        self.excluded = set()

    def load_db(self, db_file=''):
        if db_file:
            self.db_file = os.path.abspath(db_file)
        if os.path.isfile(self.db_file):
            file_ext = os.path.splitext(self.db_file)[1]
            binary = {'yml': False, 'pkl': True}.get(file_ext, False)
            with open(self.db_file, ['r', 'rb'][binary]) as fin:
                if binary:
                    self.candidates, self.actors, self.excluded = pickle.load(fin)
                else:
                    _ = yaml.load(fin, Loader=yaml.FullLoader)
                    # stuff needs to happen here

    def save_db(self):
        print(f'Saving DB with {len(self.actors)} entries...')
        file_path = os.path.abspath(self.db_file)
        file_ext = os.path.splitext(self.db_file)[1]
        binary = {'yml': False, 'pkl': True}.get(file_ext, False)

        with open(file_path, ['w', 'wb'][binary]) as fout:
            if binary:
                pickle.dump(self, fout)
            else:
                yaml.dump(self, fout)

Сначала я играл с pickle, по причинам отладки я перешел на YAML. Дамп объекта работает нормально, но при загрузке файла YAML я получаю

AttributeError: у объекта 'Actor' нет атрибута 'url'

, и я не могу понять, почему! У кого-нибудь есть идеи?

Дополнительная обратная связь:

  File "my_scripts/parse_actor_data.py", line 169, in load_db
    _ = yaml.load(fin, Loader=yaml.FullLoader)
  File "my_scripts/venv/lib/python3.6/site-packages/yaml/__init__.py", line 114, in load
    return loader.get_single_data()
  File "my_scripts/venv/lib/python3.6/site-packages/yaml/constructor.py", line 51, in get_single_data
    return self.construct_document(node)
  File "my_scripts/venv/lib/python3.6/site-packages/yaml/constructor.py", line 60, in construct_document
    for dummy in generator:
  File "my_scripts/venv/lib/python3.6/site-packages/yaml/constructor.py", line 399, in construct_yaml_set
    value = self.construct_mapping(node)
  File "my_scripts/venv/lib/python3.6/site-packages/yaml/constructor.py", line 218, in construct_mapping
    return super().construct_mapping(node, deep=deep)
  File "my_scripts/venv/lib/python3.6/site-packages/yaml/constructor.py", line 144, in construct_mapping
    mapping[key] = value
  File "my_scripts/parse_actor_data.py", line 148, in __hash__
    return hash(self.url)
AttributeError: 'Actor' object has no attribute 'url'
...