Fehler in Funktion nicht auffindbar, Verbesserung erwünscht

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
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

Hallo Zusammen,

ich schreibe gerade an einem Diary-Programm und probiere dabei auch einiges aus. Hier habe ich nun mehrere Fragen dazu.

Erstmal komme ich nicht weiter bei folgender problematischen Meldung:

Hier der Code

Code: Alles auswählen


#!/usr/bin/env python3.2

from os import chdir, environ, access, mkdir, chdir
from os.path import join
                            # -->> Parameter

ENV         =       environ['HOME']
PROG_NAME   =       'Little-Diary'

                            # <<-- Parameter
                            # -->> Init-Bench

collection = (w, m, d, t, y) = strftime('%c').split(' ')
collection.append(join(ENV, PROG_NAME)) # following as 'col'

                            # <<-- Init-Bench
                            # -->> Sourcecode

class Make_Tree(self, collection):
    def check_dir(self, col=collection):
        if access(col[5], os.F_OK):
            chdir(col[5])
            if access(col[1], os.F_OK):
                chdir(col[1])
                if access(col[2], os.F_OK):
                    chdir(col[2])
                    with open('pass.txt', 'w') as file: #nur Platzhalter
                        write('Platzhalteraufruf')       #nur Platzhalter
                else:                            
                    mkdir(col[2])                
            else:                                
                mkdir(col[1])                    
        else:                                    
            mkdir(col[5])                        
                                                 
                            # <<-- Sourcecode   

und hier die Meldung

Code: Alles auswählen


  File "mkdir_function", line 22
    chdir(col[5])
                   ^
TabError: inconsistent use of tabs and spaces in indentation

Ich verstehe die Fehlermeldung, aber ich weiss nicht wo das Problem ist, ich schätze es ist in den Aufrufen der Funktionen strftime oder join, aber da habe ich das im Interpreter schon alles getestet, deshalb wundert es mich, da es dort gefunz hat. Seht Ihr wo des rätsels Lösung ist?

2. Frage. Das ist eine Funktion, die prüft ob ein Ordner existiert, wenn nicht legt er ihn an und macht weiter. Die komplette Funktion soll in das DiaryProgramm integriert werden um per textfeld.get abzuspeichern. Kennt Ihr vllt einen anderen Lösungsansatz der effektiver ist?

Danke im Voraus
F.
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Zur ersten Fehlermeldung: Offensichtlich vermischt du Tabs und Leerzeichen bei der Einrückung. Da für Python die Einrückung aber wichtig ist, kann es so nicht mehr unterscheiden. Verwende, wie von PEP-8 vorgeschlagen, 4 Leerzeichen zum Einrücken, keine Tabs. Bei guten Editoren kann man das einstellen, IDLE macht das automatisch richtig.

Zur zweiten Frage: schau dir mal die Module os und os.path genauer an. Unter anderem gibt es darin os.path.exists(path), das auf das Vorhandensein eines Pfades prüft, und os.makedirs(path), das einen kompletten Pfad erstellen kann.
BlackJack

@Faerelis: Die Klasse macht überhaupt keinen Sinn.
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

Wow BlackJack, super Post, dem kann ich jtz eine ganze Geschichte entnehmen...

Dass das nicht die King Class ist weiss ich selbst, aber deshalb frage ich ja hier nach!

Mit dem vorherigen Post kann ich was anfangen und das werde ich auch verwenden, Danke @ sparrow
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

Nochmal Danke @ sparrow, daraus habe ich das hier gemacht und es funktioniert wunderbar:

Code: Alles auswählen


    def file_name(self): #Erzeugt den letztendlichen Namen für die Datei
        environment = environ['HOME']
        time_stamp = strftime('%H-%M-%S') + '.txt'
        return time_stamp

    def save_exit(self, ENV=ENV, PROG_NAME=PROG_NAME):
        col = (w, m, d, t, y) = strftime('%c').split(' ')   # col for collection        
        col.append(join(ENV, PROG_NAME, col[4], col[1], col[2]))
        path_ = exists(col[5])
        if path_:
            name = self.file_name()
            a = self.text.get('1.0',END)
            with open(join(col[5], name), 'w') as file:
                file.write(a)
                root.destroy()
        else:
            makedirs(col[5]) 
            save_exit(self, ENV=ENV, PROG_NAME=PROG_NAME) #rekursiver Aufruf

Wenn jmd mir noch aufzeigen könnte was man noch besser machen kann, würde es mich freuen.

MfG
Ich
deets

Wo soll man anfangen?

Bei dem sinnlosen statements in file_name (environment = ...), den auf schlecht benannte ein-buchstaben-Namen gebundenen Werten aus strftime, die du dann doch nicht benutzt, sondern stattdessen col[<irgendein-nicht-nachvollziehbarer-index>], den gross geschriebenen Parameternamen, welche PEP8 verletzen, dem root.destroy() welches nicht in das with-statement gehoert, weil es keinerlei Bezug zu dem Contextmanager hat, dem seltsam benannten "path_", eine Konvention, die man sonst fuer builtins oder Schluesselworte benutzt?


Such dir was aus! Und ich hoffe, das war jetzt hilfreicher, als die knappe & voellig korrekte Bemerkung von Blackjack. Schliesslich moechte man ja nicht riskieren, einen bescheidenen Zeitgenossen wie dich zu veraergern, dem man umsonst seine Zeit zur Code-Kritik widmet!
Faerelis
User
Beiträge: 34
Registriert: Sonntag 20. November 2011, 16:55

Das Thema ist abgeschlossen.

Aber dieser Kommentar ist nicht durchdacht und diese verblümte Beleidigung kannst du dir schenken. "Aufregen" ist nicht angebracht wenn man was lernen will, denn wenn ich alles wüsste, z.B. die Dinge die du aufgeführt hast, würde ich nicht fragen! von daher ist auch die Tatsache, dass du hier -wie BlackJack - nur Mängel aufführst, vollkommen am Sinn dieses Forums vorbeigeschossen, anstatt sinnvolle Kritik mit Lösungshinweisen zu geben, wird hier nur geklagt. Ihr tut so als würde jeder frisch gebacken als Programmierer zur Welt kommen und sich nicht alles mühsam aneignen, ich bin gerade nämlich dabei mir das alles selbst anzueignen.

Jeder weitere Gedanke an dieses Thema ist zwecklos, da hier die Mitgliedsvoraussetzung anscheinend Vollzeitprogrammierer ist.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Der Beitrag von deets enthält doch jede Menge Vorschläge:

Bei dem sinnlosen statements in file_name (environment = ...)
=> die Anweisung macht nichts

den auf schlecht benannte ein-buchstaben-Namen gebundenen Werten aus strftime
=> benutze bessere Bezeichner und nicht nur einen Buchstaben

die du dann doch nicht benutzt
=> unbenutzte Variablen

sondern stattdessen col[<irgendein-nicht-nachvollziehbarer-index>]
=> du hast alles an Namen gebunden, warum benutzt du Indizes

den gross geschriebenen Parameternamen, welche PEP8 verletzen
=> PEP 8

dem root.destroy() welches nicht in das with-statement gehoert, weil es keinerlei Bezug zu dem Contextmanager hat
=> das root.destroy() gehört nicht ins with-Statement

dem seltsam benannten "path_", eine Konvention, die man sonst fuer builtins oder Schluesselworte benutzt
=> Du solltest über den Namen von "path_" nachdenken

Vielleicht hast du deets Beitrag einfach nicht richtig gelsen, aber aus den einzelnen Punkten werden meiner Meinung nach die Vorschläge schon deutlich.
Das Leben ist wie ein Tennisball.
deets

Faerelis hat geschrieben:Aber dieser Kommentar ist nicht durchdacht und diese verblümte Beleidigung kannst du dir schenken.
Wie man in den Wald hineinruft... wenn du als unerfahrener Programmierer mit offensichtlichen Schwierigkeiten guten Code zu schreiben die Auesserungen von dir hier Hilfestellung angedeihenden Nutzern abqualifizierst, musst du dich nicht wundern.

Im uebrigen gilt

http://www.catb.org/esr/faqs/smart-ques ... l#keepcool

Genau so ist BlackJack's Antwort zu verstehen: auf den Punkt gebrachte, sachliche Kritik. Kein Wohlfuehlrhetorik ala "Feeeeeein gemacht, ein schoenes Codehaeufi". Die gibt's in der Kinderkrabbelgruppe.
Antworten