2017-12-03 4 views
-1

私はPythonでFileSystemのようなものを作ろうとしています。私の目標は、いくつかのファイルを含むことができるいくつかのデータとディレクトリを含むことができるファイルを作ることです。 :その後、私はいくつかの簡単なコマンドだから、奇妙なKeyError || Python3.6.1

  • CD

  • LS

  • mk_dir

  • mk_file

を持って、今、私はこれで問題を抱えていますそこにはDirectoryBaseクラスがありますParentDir(ファイル/ディレクトリが保存されているディレクトリ)がないため、Directoryとは異なります。次に、DirectoryBaseを拡張し、path()メソッド(pathをfile/dirに返すメソッド)を上書きするDirectoryクラスがあり、data dictには別のデフォルトのキー '..'がありますが、データ辞書で見つけようとしているときにKeyErrorが発生します。別の奇妙なことは、ファイル/ディレクトリが存在するかどうかテストしていますが、そうでない場合は返されるため、これがどのように可能であるかわからないため、KeyErrorが得られます。

これは私のコードです:

. 
test 
Traceback (most recent call last): 

. 
    File "/Users/jan/PycharmProjects/Xaon/src/fs.py", line 106, in <module> 
test 
    fs.cmd_cd(['..']) 
idk.txt 

    File "/Users/jan/PycharmProjects/Xaon/src/fs.py", line 32, in cmd_cd 
    f = self._find(path) 
    File "/Users/jan/PycharmProjects/Xaon/src/fs.py", line 27, in _find 
    _cd = _cd[part] 
    File "/Users/jan/PycharmProjects/Xaon/src/fs.py", line 76, in __getitem__ 
    return self.data[item] 
KeyError: '..' 

またはときに私は版画削除:それはあまりにも混乱している場合、私は申し訳ありません

Traceback (most recent call last): 
    File "/Users/jan/PycharmProjects/Xaon/src/fs.py", line 106, in <module> 
    fs.cmd_cd(['..']) 
    File "/Users/jan/PycharmProjects/Xaon/src/fs.py", line 32, in cmd_cd 
    f = self._find(path) 
    File "/Users/jan/PycharmProjects/Xaon/src/fs.py", line 27, in _find 
    _cd = _cd[part] 
    File "/Users/jan/PycharmProjects/Xaon/src/fs.py", line 76, in __getitem__ 
    return self.data[item] 
KeyError: '..' 

class AttributeDictionary(dict): 
    def __init__(self, **kwargs): 
     super().__init__(**kwargs) 
     self.__getattr__ = self.__getitem__ 
     self.__setattr__ = self.__setitem__ 
     self.__delattr__ = self.__delitem__ 


class FileManager(object): 
    def __init__(self): 
     self.disk_dir = DirectoryBase('__disk__') 
     self.current_dir = self.disk_dir 

    def _find(self, path): 
     """ Gets file/dir object using path """ 
     _cd = self.current_dir 
     for part in path: 
      _cd = _cd[part] 
     return _cd 

    def cmd_cd(self, path): 
     """ Classic unix `cd` command """ 
     f = self._find(path) 
     if f is DirectoryBase: 
      self.current_dir = f 
     else: 
      return FileSystemError('DirectoryNotFound') 

    def cmd_ls(self): 
     """ Classic unix `ls` command """ 
     return ConsoleOutput(''.join([f'{i}\n' for i in self.current_dir.data])) 

    def cmd_mkfile(self, name): 
     """ file making command """ 
     self.current_dir.__setitem__(name, File(name, self.current_dir)) 

    def cmd_mkdir(self, name): 
     """ file making command """ 
     self.current_dir.__setitem__(name, Directory(name, self.current_dir)) 


class File(object): 
    def __init__(self, name, pd): 
     self.data = [0x00] 
     self.name = name 
     self.pd = pd 

    def path(self): 
     return [self.name] + self.pd.path() 

    def __sizeof__(self): 
     return len(self.data) 


class DirectoryBase(AttributeDictionary): 
    def __init__(self, name, **kwargs): 
     super().__init__(**kwargs) 
     self.name = name 
     self.data = {'.': self} 

    def path(self): 
     return self.name 

    def __getitem__(self, item): 
     if item in self.data.keys(): 
      return FileSystemError('FileNotFound') 
     return self.data[item] # KeyError: '..' found here 

    def __setitem__(self, key, value): 
     if key in self.data.keys(): 
      return FileSystemError('FileAlreadyExists') 
     self.data[key] = value 

    def __delitem__(self, key): 
     if key in self.data.keys(): 
      return FileSystemError('FileNotFound') 
     self.data.__delitem__(key) 


class Directory(DirectoryBase): 
    def __init__(self, name, pd, **kwargs): 
     super().__init__(name, **kwargs) 
     self.pd = pd 
     self.data = {'.': self, '..': self.pd} 

    def path(self): 
     return [self.name] + self.pd.path() 


if __name__ == '__main__': 
    fs = FileManager() 
    fs.cmd_mkdir('test') 
    print(fs.cmd_ls()) 
    fs.cmd_cd(['test']) 
    fs.cmd_mkfile('idk.txt') 
    print(fs.cmd_ls()) 
    fs.cmd_cd(['..']) 
    print(fs.cmd_ls()) 

エラーは次のようになります初心者と私の英語は悪いです。

+0

あなたはまだ学んでいる間、あなたは、Python 3.xのに切り替える必要があります。 – wwii

+0

私はpythonを使用しています。3.6.1 – C05

+0

申し訳ありませんが、 'object' - ' class File(オブジェクト: ' – wwii

答えて

2

コードロジックは欠陥がある:

def __getitem__(self, item): 
    if item in self.data.keys(): 
     return FileSystemError('FileNotFound') 
    return self.data[item] # KeyError: '..' found here 

キーに存在するときにエラーを投げています。ただ、条件を否定(およびunpythonic &役に立たないとPython 2でさえ、パフォーマンスキラーである.keys()をドロップ):

def __getitem__(self, item): 
    if item not in self.data: 
     return FileSystemError('FileNotFound') 
    return self.data[item] 

ところで__delitem__に同じエラーがあります。

固定(およびstrとunexisting /図示しないクラスの大部分をスタブ)するとき、私は次のような出力が得られます。

. 
test 

. 
idk.txt 
test 

. 
idk.txt 
test 
+0

ありがとうございますが、私の問題は解決していません... しかし、その問題はcdコマンドにあります。 – C05

+0

これは、KeyErrorを投げているわけではありませんが、トレースバックに指された行ではありません。 – wwii

+0

あなたは完全には読まなかった:drop '.keys ) 'を追加しますが、ほとんどの場合あなたの状態に' not 'を追加します。あなたは既存の上書きを避けたいが、必要と否定を得る必要があるので、 'setitem'のための条件はOKです。 –