Для небольшого учебного проекта я пытаюсь создать «базу данных» 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'