저는 파이썬에서 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 지문을 삭제할 때 초급 영어는 나쁘다.
여전히 배우고있는 동안 당신은 파이썬 3.x를 전환해야합니다. – wwii
파이썬 3.6.1을 사용하고 있습니다. – C05
'object' -'class File (object :' – wwii