2017-12-03 10 views
-1

저는 파이썬에서 FileSystem과 같은 것을 만들려고합니다. 내 목표는 파일을 포함 할 수있는 데이터 및 디렉토리를 포함 할 수있는 파일을 만드는 것입니다. 그럼 난이상한 KeyError || Python3.6.1

  • CD

  • LS

    그래서
  • mk_dir

  • mk_file

몇 가지 간단한 명령을 가지고, 지금은이 문제를 가지고 : 다음과 같은 DirectoryBase 클래스가 있습니다. ParentDir (File/Directory가 저장된 Directory)가 없으므로 Directory와 다릅니다. 그런 다음 DirectoryBase를 확장하고 path() 메서드 (path/file에 경로를 반환하는 메서드)를 덮어 쓰는 Directory 클래스가 있고 data dict에는 또 다른 기본 키가 있습니다 : '..', 그러나 데이터 dict에서 찾을 때 KeyError가 발생합니다. 또 다른 이상한 점은, 파일/디렉토리가 존재하는지 테스트 중이라는 것입니다. 그렇지 않으면 반환 할 수 없으므로 이것이 가능한지 모르겠다. 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()) 

오류는 다음과 같습니다 :

내 코드가 너무 혼란 경우

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: '..' 

미안 해요, 내가 :

. 
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: '..' 

또는 I 지문을 삭제할 때 초급 영어는 나쁘다.

+0

여전히 배우고있는 동안 당신은 파이썬 3.x를 전환해야합니다. – wwii

+0

파이썬 3.6.1을 사용하고 있습니다. – C05

+0

'object' -'class File (object :' – wwii

답변

2

코드 로직은 결함이 : 키 존재 할 때 오류를 던지고있다

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

. 그냥 조건을 부정 (그리고 unpythonic & 쓸모 파이썬 2도 성능 살인자입니다 .keys() 드롭) :

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

BTW __delitem__에 동일한 오류가 있습니다.

고정 (그리고 str와 unexisting/도시하지 않은 클래스의 대부분을 스텁) 나는 다음과 같은 출력을 얻을 때 :

. 
test 

. 
idk.txt 
test 

. 
idk.txt 
test 
+0

고마워요,하지만 내 문제를 고치고 있지 않습니다 ... 하지만 지금 보았습니다. 그 문제는 테스트 명령을 찾을 수 없기 때문에 cd 명령에 있습니다 – C05

+0

그것이 KeyError를 던지지는 않지만, Traceback에서 가리키는 라인이 아닙니다. – wwii

+0

완전히 읽지 않은 경우 : drop'.keys ()'을 사용하지만 대부분은 조건에'not '을 추가합니다.기존의 덮어 쓰기를 피하기 때문에 조건은'setitem'에 대해서는 괜찮습니다. –