1

「ミニデータベース」を作成したい。多くの変数を含む 1 つのファイルを作成し、それらの変数をファイルから取得しながら、ファイルに変数を追加できるようにしたいですか? たとえば、これが 'mini-db' であるとします。

hello = ['a', 'b', 'c']
world = ['d', 'e', 'f']
foo = ['g', 'h', 'i']

別のファイルから、次のようなことを言いたいと思います:

print MiniDB.hello[0]

したがって、基本的に変数にアクセスします。また、ファイルに変数を書き込む必要があります。このようなもの:

MiniDB.bar = ['j', 'k', 'l']

これどうやってするの?

4

2 に答える 2

3

shelveこれを行う最も簡単な方法です。ただし、同時実行制限に注意してください。

于 2012-06-21T20:52:01.063 に答える
0

これはあなたが探しているものではないかもしれませんが、このクラスはプログラム設定を保存することを可能にします。必要な変数を表すデフォルト設定でロードし、名前空間を生成するための辞書を埋め込みます。完全ではありませんが、データ型が変更されないようにしながら、複数のデータベース定義を相互に共存させようとします。使用分野は限られていますが、必要なソリューションとして機能する場合があります。

import copy
import pprint
import pickle

################################################################################

class _Interface:

    def __init__(self, default, database=None):
        self.__default = default
        if database is None:
            self.__database = copy.deepcopy(default)
        else:
            self.__database = database

    def __repr__(self):
        return pprint.pformat(self.__database)

    def __getattr__(self, name):
        attr = self.__default[name]
        if isinstance(attr, dict):
            return _Interface(attr, self.__database[name])
        raise AttributeError(name)

    def __setattr__(self, name, value):
        if name in {'_Interface__default', '_Interface__database'}:
            super().__setattr__(name, value)
        else:
            raise AttributeError(name)

    def __getitem__(self, name):
        item = self.__default[name]
        if isinstance(item, dict):
            raise KeyError(name)
        return self.__database[name]

    def __setitem__(self, name, value):
        item = self.__default[name]
        if isinstance(value, type(item)):
            self.__database[name] = value
        else:
            raise TypeError(type(value))

################################################################################

class Registry(_Interface):

    @property
    def __database(self):
        return self._Interface__database

    def load(self, path):
        with open(path, 'rb') as file:
            data = pickle.load(file)
        self.__merge(data, self.__database)

    @classmethod
    def __merge(cls, source, sink):
        for key, value in source.items():
            if key not in sink:
                sink[key] = value
            elif isinstance(value, type(sink[key])):
                if isinstance(value, dict):
                    cls.__merge(value, sink[key])
                else:
                    sink[key] = value

    def save(self, path):
        with open(path, 'wb') as file:
            pickle.dump(self.__database, file)

################################################################################

file1 = Registry({'hello': ['a', 'b', 'c'],
                  'world': ['d', 'e', 'f'],
                  'foo': ['g', 'h', 'i'],
                  'namespace': {'j': 0,
                                'k': 1,
                                'm': '2',
                                'n': '3'}})

file2 = Registry({'hello': ['a', 'b', 'c'],
                  'world': ['d', 'e', 'f'],
                  'foo': ['g', 'h', 'i'],
                  'namespace': {'j': '4',
                                'k': '5',
                                'm': '6',
                                'n': '7'},
                  'bar': []})

file1['hello'][0] = 'z'
file1.save('mini.db')
file2.load('mini.db')
file2['bar'].extend(['j', 'k', 'l'])

print(file2)
print(file2.namespace['k'])
print(file2.namespace['m'])
于 2012-06-21T21:30:36.670 に答える