Class too big and hard to add new features处的每个人都完全没有被问题解决,这个问题以某种方式将命令行选项连接到方法,但我找不到这方面的文档。它不是optparse
,argparse
或sys.argv
- 问题意味着方法和命令行选项之间存在某种直接关系。我错过了什么?
答案 0 :(得分:4)
他们之间没有任何固定的联系。您链接的问题似乎是一个可以执行多种不同操作之一的程序,命令行参数在它们之间切换。这些事物恰好在程序中使用方法实现。
问题暗示他们使用类似argparse
之类的东西来写这些之间的粘合剂;但方法的使用只是特定程序的实现细节。
答案 1 :(得分:1)
我只是使用这样的类,看起来不是一个好主意,因为一旦你得到很多命令就很难维护。
class myprogram(object):
def __init__(self)
self.prepare()
def prepare(self):
# some initializations
self.prepareCommands()
def prepareCommands(self):
self.initCommand("--updateDatabase", self.updateDatabase)
self.initCommand("--getImages", self.getImages)
# and so on
def initCommand(self, cmd, func):
options = sys.argv
for option in options:
if option.find(cmd)!=-1:
return func()
# my commands
def updateDatabase(self):
#...
def getImages(self):
#...
if __name__ == "__main__":
p = myprogram()
EDIT1: 这是我刚刚实施的一种更清洁的方式:
myprogram.py:
from config import * # has settings
from commands import *
from logsys import log
import filesys
class myprogram(object):
def __init__(self):
log(_class=self.__name__, _func='__init__', _level=0)
log(_class=self.__name__, _func='__init__', text="DEBUG LEVEL %s" % settings["debug"], _level=0)
self.settings = settings
self.cmds = commands
def prepare(self):
log(_class=self.__name__, _func='prepare', _level=1)
self.dirs = {}
for key in settings["dir"].keys():
self.dirs[key] = settings["dir"][key]
filesys.checkDir(self.dirs[key])
def initCommands(self):
log(_class=self.__name__, _func='initCommands', _level=1)
options = sys.argv
for option in options:
for cmd in self.cmds.keys():
if option.find(cmd) != -1:
return self.cmds[cmd]()
if __name__ == '__main__':
p = myprogram()
p.prepare()
p.initCommands()
commands.py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
commands = {}
#csv
import csvsys
commands["--getCSV"] = csvsys.getCSV
#commands["--getCSVSplitted"] = csvsys.getCSVSplitted
# update & insert
import database
commands["--insertProductSpecification"] = database.insertProductSpecification
# download
import download
commands["--downloadProductSites"] = download.downloadProductSites
commands["--downloadImages"] = download.downloadImages
# parse
import parse
commands["--parseProductSites"] = parse.parseProductSites
EDIT2:我现在更新了与您的问题相关联的问题,并提供了更完整的示例Class too big and hard to add new features