我正在尝试编写一个类似于内置函数和我见过的其他一些“成熟的”Python 东西的类。我的 Pythonic 教育在课堂方面有点参差不齐,我担心我把这一切都搞混了。
我想创建一个用作一种存储库的类,其中包含未处理文件(及其名称)的字典和已处理文件(及其名称)的字典。我想实现一些其他(子?)类来处理诸如打开和处理文件之类的事情。文件处理类应该能够更新主类中的字典。我还希望能够直接调用各种子模块,而不必单独实例化所有内容,例如:
import Pythia
p = Pythia()
p.FileManager.addFile("/path/to/some/file")
甚至
Pythia.FileManager.addFile("/path/to/some/file")
我一直在寻找诸如此类的东西@classmethod
,super
但我不能说我完全理解它。我也开始怀疑我可能有整个继承链向后 - 我认为我的主类实际上应该是处理和处理类的子类。我也想知道这是否会作为一个包更好地工作,但这是一个单独的、非常令人生畏的问题。
到目前为止,这是我的代码:
#!/usr/bin/python
import re
import os
class Pythia(object):
def __init__(self):
self.raw_files = {}
self.parsed_files = {}
self.FileManger = FileManager()
def listf(self,fname,f):
if fname in self.raw_files.keys():
_isRaw = "raw"
elif fname in self.parsed_files.keys():
_isRaw = "parsed"
else:
return "Error: invalid file"
print "{} ({}):{}...".format(fname,_isRaw,f[:100])
def listRaw(self,n=None):
max = n or len(self.raw_files.items())
for item in self.raw_files.items()[:max]:
listf(item[0],item[1])
def listParsed(self,n=None):
max = n or len(self.parsed_files.items())
for item in self.parsed_files.items()[:max]:
listf(item[0],item[1])
class FileManager(Pythia):
def __init__(self):
pass
def addFile(self,f,name=None,recurse=True,*args):
if name:
fname = name
else:
fname = ".".join(os.path.basename(f).split(".")[:-1])
if os.path.exists(f):
if not os.path.isdir(f):
with open(f) as fil:
Pythia.raw_files[fname] = fil.read()
else:
print "{} seems to be a directory.".format(f)
if recurse == False:
return "Stopping..."
elif recurse == True:
print "Recursively navingating directory {}".format(f)
addFiles(dir,*args)
else:
recurse = raw_input("Recursively navigate through directory {}? (Y/n)".format(f))
if recurse[0].lower() == "n":
return "Stopping..."
else:
addFiles(dir,*args)
else:
print "Error: file or directory not found at {}".format(f)
def addFiles(self,directory=None,*args):
if directory:
self._recursivelyOpen(directory)
def argHandler(arg):
if isinstance(arg,str):
self._recursivelyOpen(arg)
elif isinstance(arg,tuple):
self.addFile(arg[0],arg[1])
else:
print "Warning: {} is not a valid argument...skipping..."
pass
for arg in args:
if not isinstance(arg,(str,dict)):
if len(arg) > 2:
for subArg in arg:
argHandler(subArg)
else:
argHandler(arg)
elif isinstance(arg,dict):
for item in arg.items():
argHandler(item)
else:
argHandler(arg)
def _recursivelyOpen(self,f):
if os.path.isdir(f):
l = [os.path.join(f,x) for x in os.listdir(f) if x[0] != "."]
for x in l:
_recursivelyOpen(x)
else:
addFile(f)