2012-03-31 5 views

Antwort

1

Ich benutze einfach die Klasse wie diese, was nicht eine sehr gute Idee zu sein scheint, denn es ist sehr schwer zu warten, sobald Sie viele Befehle erhalten haben.

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: Hier ist ein sauberer Weg ich gerade umgesetzt:

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: Ich habe jetzt aktualisiert meine Frage, die Sie mit Ihrer Frage mit einem vollständigeren Beispiel verbunden haben Class too big and hard to add new features

+0

Eines der Probleme mit Ihrem Beispiel ist, dass es keine Möglichkeit gibt, um Argumente wie --max-val 5 oder --treads = 5 –

+0

Wert ja, aber ich brauchte keine spezifischen Argumente für meine "Befehle", weil die Gottklasse selbst wusste, was zu tun war. ^^ –

+0

Wow, ich dachte nie daran, so etwas zu tun! Interessant. – weronika

4

Es gibt keine feste Verbindung zwischen ihnen. Die Frage, die Sie verknüpfen, scheint ein Programm zu sein, das eines von mehreren verschiedenen Dingen ausführen kann, wobei Befehlsargumente zwischen ihnen wechseln. Diese Dinge passieren im Programm mit Methoden implementiert werden.

Es wird durch die Frage impliziert, dass sie etwas wie argparse verwendet haben, um den Kleber zwischen diesen zu schreiben; aber die Verwendung von Methoden ist nur ein Implementierungsdetail des jeweiligen Programms.

Verwandte Themen