Ошибка атрибута для чего-то, что я явно определил в init - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь сделать менеджер файлов конфигурации, который хранит словари в файле рассола, в папке конфигурации в том же каталоге.У меня проблемы с надоедливой AttributeError, которая утверждает, что у меня нет атрибута _name, который я определил в первой строке init ().

Основная программа имеет2 класса, один наследует от Exceptions (класс ошибок), а другой наследует от dict (основной класс).Init берет имя и находит, существует ли файл.Если этого не происходит, то в данный файл записывается пустой словарь.

Я получаю сообщение об ошибке, когда я:
1. открываю существующий файл для печати ключей
2. записываемпара ключ-значение для существующего файла
3. попытаться получить ключ из словаря

Я пытался не вызывать dict. setitem в init и ничего не изменилось, я все еще получаю ошибку.Я попытался просто загрузить файл, делая абсолютно ничего , и не смог заставить его работать.

import os
import pickle

class ConfigDict(dict):
    '''
        This class is responsible for all main functions.

        Pass a string as an argument without a file type.

        Keywords such as 'database' and 'aiconstructer' work well.
    '''
    def __init__(self, name):
        self._name = name+'.pickle'
        if not os.path.isfile(self._name):
            with open(self._name, 'wb') as f:
                pickle.dump('{}', f)
        with open(self._name,'rb') as f:
            obj = pickle.load(f)
        if len(obj) > 2:
            for k in obj.keys():
                dict.__setitem__(self, k, obj[k])

    def __getitem__(self, key):
        if not key in self.keys():
            raise ConfigKeyError(self, key)
        return dict.__getitem__(key)

    def __setitem__(self, key, val):
        dict.__setitem__(self, key, val)
        with open(self._name, 'wb') as f:
            pickle.dump(self, f) 

Трассировка выглядит следующим образом:

      Traceback (most recent call last):
  File "interface.py", line 12, in <module>
      test = ConfigDict('alpha')
  File "/home/bear/Desktop/Config/confdict.py", line 35, in __init__
      obj = pickle.load(f)
  File "/home/bear/Desktop/Config/confdict.py", line 47, in __setitem__
      with open(self._name, 'wb') as f:
AttributeError: 'ConfigDict' object has no attribute '_name'

Код для interface.py, который инициирует это:

import sys
from confdict import ConfigDict, ConfigKeyError

test = ConfigDict('alpha')

if len(sys.argv) == 3:
    key = sys.argv[1]
    val = sys.argv[2]
    print('Writing')
    test[key] = val
    print('Done')

elif len(sys.argv) == 2:
    key = sys.argv[1]
    print('{}:{}'.format(key,test[key]))

else:
    print('Keys   :   Values')
    print('-----------------')
    for k in test.keys():
        print('{}   :   {}'.format(k,test[k]))

Я ожидаю, что смогу загрузить содержимое файла pickle в self, но вместо этого я получу AttributeError.Это то, что я делаю грамматически неправильно, или есть правило, которому я забыл следовать?Большое спасибо за любую помощь заранее.

...