我正在下面的小項目: https://github.com/AndreaCrotti/project-organizer工廠方法在Python
後者以短暫的旨在更輕鬆地管理許多不同的項目。 有用的東西之一是自動檢測我正在處理的項目的種類,正確設置一些命令的方法。
此刻,我正在使用classmethod「match」函數和遍歷各種「匹配」的檢測函數。 我相信可能會有更好的設計,但找不到它。
任何想法?
class ProjectType(object):
build_cmd = ""
@classmethod
def match(cls, _):
return True
class PythonProject(ProjectType):
build_cmd = "python setup.py develop --user"
@classmethod
def match(cls, base):
return path.isfile(path.join(base, 'setup.py'))
class AutoconfProject(ProjectType):
#TODO: there should be also a way to configure it
build_cmd = "./configure && make -j3"
@classmethod
def match(cls, base):
markers = ('configure.in', 'configure.ac', 'makefile.am')
return any(path.isfile(path.join(base, x)) for x in markers)
class MakefileOnly(ProjectType):
build_cmd = "make"
@classmethod
def match(cls, base):
# if we can count on the order the first check is not useful
return (not AutoconfProject.match(base)) and \
(path.isfile(path.join(base, 'Makefile')))
def detect_project_type(path):
prj_types = (PythonProject, AutoconfProject, MakefileOnly, ProjectType)
for p in prj_types:
if p.match(path):
return p()
在這一點上,我想我會讓'make_project'坐在類的外面,只是一個普通的函數。它可以讓所有事情的命名更自然一點。另外,雖然「複雜性需要去某個地方」,但我不認爲我喜歡所有子類的元組都是父類中的信息。 –
非常感謝。我也同意make_project在外面,也因爲我們實際上並沒有真正使用「cls」參數來進行make_project。 –