CommandLine Programm (TekNap)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
silentpolygon
User
Beiträge: 9
Registriert: Montag 14. Mai 2007, 21:49

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
midan23
User
Beiträge: 147
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

Hallo,

schon mal einen Blick aufs cmd-Modul geworfen ?
pheder
User
Beiträge: 11
Registriert: Dienstag 14. Oktober 2008, 15:56
Kontaktdaten:

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?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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.
pheder
User
Beiträge: 11
Registriert: Dienstag 14. Oktober 2008, 15:56
Kontaktdaten:

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.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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.
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.
silentpolygon
User
Beiträge: 9
Registriert: Montag 14. Mai 2007, 21:49

Danke.

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

Gruß
Thorsten
Antworten