Seite 1 von 1

CommandLine Programm (TekNap)

Verfasst: Samstag 27. Dezember 2008, 12:53
von silentpolygon
Hallo Leute

Ich suche nun nach einer ewigkeit nach einem Weg ein Programm zu schreiben, das sich verhält wie Beispielsweise TekNap. Wer das nicht kennt; TekNap läuft in einer normalen Unix-Shell oder Windows Eingabeaufforderung. über Kommandos wie zum Beispiel "/login username password" kann man sich bei TekNap in Napster und IRC Netzwerke anmelden. Ich hab nun damit begonnen, soetwas in der Art zu schreiben.

Code: Alles auswählen

class parseapp():
    def __init__(self):
        self.text = ''
        
    def login(self):
        print 'logged in as ' + self.text

    def parseui(self, text):
        print self.text

    def maininput(self):
        text = raw_input('<User> ')
        self.parseui(text)

        if text == 'login':
            self.login()
            self.maininput()
                
    def run(self):
        self.maininput()
        
newparser = parseapp()
newparser.run()
Nur ist es damit schwierig viel Funktionalität einzubauen. Gibt es vielleicht eine Librarie, die für solche Zwecke geschrieben ist?

Ich bin für jeden Lösungsansatz dankbar.
Btw: Wie ich Netzwerkfunktionen einbaue weiss ich (Twisted). Es geht nur um die Benutzeroberfläche.

Danke im vorraus
Thorsten

Verfasst: Samstag 27. Dezember 2008, 14:18
von midan23
Hallo,

schon mal einen Blick aufs cmd-Modul geworfen ?

Verfasst: Samstag 27. Dezember 2008, 15:18
von pheder
Hat zwar nix mit der Thematik zu tun, aber irgendwie schon, d.h. mit dem Modul "cmd":

Wenn davon abgeraten wird, "cmd.Cmd" zu instanzieren, wo ist dann der praktische Nutzen dieser Klasse, das ganze könnte doch genauso nur im Modul gelöst sein? Natürlich kann von der Klasse geerbt und die damit erweitert werden, aber die Klasse wird dann doch nur als namespace missbraucht, wenn ich das richtig verstehe, immerhin wäre folgendes auch möglich, wenn "cmd" der Klasse "cmd.Cmd" entsprechen würde:

Code: Alles auswählen

import cmd

def myfunction: pass
cmd.newfunction = myfunction
Also anstatt von:

Code: Alles auswählen

import cmd

class MyCmd(cmd.Cmd):
    def newfunction: pass
Wozu Klassen wenn keine Instanzen genutzt werden?

Verfasst: Samstag 27. Dezember 2008, 15:43
von audax
pheder hat geschrieben:

Code: Alles auswählen

import cmd

def myfunction: pass
cmd.newfunction = myfunction
Dann kann es aber nur eine einzige "Instanz" geben.

cmd.Cmd ist eine Abstrakte Klasse die einem alle für so ein Interface notwendige Funktionalität bietet.

Verfasst: Samstag 27. Dezember 2008, 16:06
von pheder
Hab ich ja schon verstanden. Allerdings ist ja auch nur eine einzige Instanz notwendig, zumindest wenn man dem Entwickler glaubt.
There is no good reason to instantiate Cmd itself.
Meine Frage war ja nur die nach dem Grund trotzdem eine Klasse hierfür zu haben, vielleicht hab ich ja da etwas am Prinzip missverstanden, vielleicht bin ich ja auch ein Genie und habe einen Fehler im Konzept gefunden :D Ich wüsste nur nicht welchen Vorteil die Verwendung einer Klasse hier bietet.

Verfasst: Samstag 27. Dezember 2008, 16:14
von audax
Cmd selbst implementiert auch nur das Gerüst selbst mit dem man sich das Commandline-Interface baut. Für sich gesehen hat es nur den Befehl "help" und ist somit nicht sonderlich nützlich.
Das ist mit dem Kommentar gemeint.

Verfasst: Samstag 27. Dezember 2008, 17:04
von lunar
pheder hat geschrieben:Meine Frage war ja nur die nach dem Grund trotzdem eine Klasse hierfür zu haben, vielleicht hab ich ja da etwas am Prinzip missverstanden, vielleicht bin ich ja auch ein Genie und habe einen Fehler im Konzept gefunden :D Ich wüsste nur nicht welchen Vorteil die Verwendung einer Klasse hier bietet.
Wie willst du denn ein Modul sinnvoll erweitern?

Der Weg dazu würde nur über Monkey-Patching führen, und das ist im Allgemeinen keine gute Idee.

Desweiteren hält ein Modul einen einzige, globalen Zustand. Wäre "cmd.Cmd" keine Klasse, müsste man höllisch aufpassen, wenn man ein Modul, dass seinerseits "cmd" nutzt, für einen "cmd"-Interpreter nutzen möchte.

Eine Klasse lässt sich dagegen wunderbar über Vererbung erweitern, und lebt isoliert von anderen Implementierungen. Außerdem ermöglicht der klassenbasierte Ansatz, durch Vererbung Features bereits existierender Cmd-Implementierungen zu übernehmen, und diese dann zu erweitern.

Verfasst: Samstag 27. Dezember 2008, 23:25
von silentpolygon
Danke.

Bin gerade dabei mich damit zu befassen. Sieht schonmal sehr zuversichtlich aus.

Gruß
Thorsten