Ohne die genaue Funktionalität nachvollzogen zu haben:
- fehlende Dokumentation. Was genau macht das Tool? Speziell bei einem komplexen CLI Programm solltest Du da investieren und einen Module-DocString einbauen. Ggf. sogar mit Aufrufbeispielen, wie man es aus man-Pages kennt.
- Code auf Modulebene vermeiden!
- Nutze Stringformatierungsmethoden anstelle von "+". Also z.B. `"".format()`.
- Bei `copydir` würde ich mir mal `os.walk` angucken. Das erspart Dir ggf. auch die Rekursion.
- Nutze gute Namen für Deine Bezeichner. `x` und `y` sind das sicher nicht! Wieso nicht `name` anstelle von `x` ind `copydir`?
- vermeide globale Variablen! `cnt` ist da ein gutes Beispiel. Man wundert sich in der Funktion `copydir` was das für ein Objekt ist. Dann findet man es viel weiter unten als globale Variable. Neben der umständlichen Zuordnung bergen globale Variablen stets die Gefahr, dass diese ungewollte manipuliert werden während des Programmablaufs. Es gibt noch viele Gründe dagegen,
hier stehen einige Gründe. (`global` verwendest Du zwar nicht, aber thematisch ist das egal)
- Dieser Name und das Objekt dahinter sind auch kritisch:
Code: Alles auswählen
#list [copy,versions/override, equal, delete]
cnt = [0,0,0,0]
Du brauchst also selber einen Kommentar, um zu erklären, was es mit dem Objekt auf sich hat? Wieso verwendest Du kein Dictionary, wenn Du doch "sprechende" Namen für die Einträge der Liste kennst?
Und was bedeutet `cnt`?
- bei den imports würde ich auch zeilenweise vorgehen:
Code: Alles auswählen
# so nicht
import foo, bar, ...
# besser so
import foo
import bar
...
- Last but not least: Laut PEP8 sollte man 4 Spaces als Einrückung verwenden, nicht 2.