Code Cleaner: Automatisch sauberen Python-Code schreiben

PEP8, Dead-Code-Erkennung & AST-basiertes Refactoring in einem Tool

Python AST Black isort

🧹 Ihr Code. Automatisch sauber. Heute.

📞 02406 803 7603 ✉️ info@computerkumpel.de

🧼 Warum automatisierte Code-Bereinigung?

Entwickler verbringen durchschnittlich 15–20% ihrer Zeit mit manueller Code-Formatierung und Code-Review-Ping-Pong wegen Stil-Fragen. Ein automatisierter Cleaner eliminiert diese Diskussionen komplett — der Code kommt garantiert sauber aus der Pipeline.

⏱️
Zeitersparnis
Keine manuelle Formatierung mehr. Der Cleaner läuft als Pre-Commit-Hook und in der CI/CD-Pipeline.
🎯
Konsistenz
100% einheitlicher Code-Stil im gesamten Team. Kein „Das ist aber mein Stil" mehr.
🔍
Dead-Code-Erkennung
AST-Analyse findet ungenutzte Imports, Variablen und Funktionen — bevor sie technische Schulden werden.
🔄
CI/CD-ready
Integrierbar als GitHub Action, GitLab CI Job oder Pre-Commit Hook. Check-Mode für Pull Requests.

⚙️ Clean-Pipeline: 4 Schritte zum sauberen Code

📏
1. Formatter (Black)
Automatische Code-Formatierung nach PEP8. Keine Konfiguration nötig — opinionated by design.
📦
2. Import-Sorter (isort)
Sortiert Imports: stdlib → third-party → local. Entfernt doppelte und ungenutzte Imports.
🌳
3. AST-Analyzer
Eigener AST-Walker findet toten Code, zu komplexe Funktionen und potenzielle Bugs.
📊
4. Report
JSON/Markdown-Report mit allen gefundenen Issues, Metriken und Fix-Vorschlägen.

💻 Technische Umsetzung

🐍 Der AST-Analyzer-Kern

import ast
from pathlib import Path

class CodeAnalyzer(ast.NodeVisitor):
    """AST-Walker zur Erkennung von Code-Smells."""
    
    def __init__(self, max_complexity: int = 10):
        self.issues = []
        self.max_complexity = max_complexity
        self.current_function = None
    
    def visit_FunctionDef(self, node):
        self.current_function = node.name
        complexity = self._cyclomatic_complexity(node)
        
        if complexity > self.max_complexity:
            self.issues.append({
                'type': 'high_complexity',
                'function': node.name,
                'line': node.lineno,
                'complexity': complexity,
                'suggestion': f'Funktion aufteilen (Komplexität: {complexity})'
            })
        
        self.generic_visit(node)
    
    def visit_Import(self, node):
        for alias in node.names:
            if alias.name not in self.used_names:
                self.issues.append({
                    'type': 'unused_import',
                    'name': alias.name,
                    'line': node.lineno
                })
    
    def _cyclomatic_complexity(self, node) -> int:
        complexity = 1
        for child in ast.walk(node):
            if isinstance(child, (ast.If, ast.For, ast.While, ast.ExceptHandler)):
                complexity += 1
            elif isinstance(child, ast.BoolOp):
                complexity += len(child.values) - 1
        return complexity

🔄 Automation Pipeline

class CleanPipeline:
    """Führt alle Cleaner in der richtigen Reihenfolge aus."""
    
    CLEANERS = ['isort', 'black', 'analyze']
    
    def run(self, path: Path, check_only: bool = False):
        results = {'files': 0, 'issues': 0, 'fixed': 0}
        
        for py_file in path.rglob('*.py'):
            results['files'] += 1
            file_results = self._clean_file(py_file, check_only)
            results['issues'] += len(file_results.get('issues', []))
            results['fixed'] += file_results.get('fixed', 0)
        
        # JSON-Report generieren
        report_path = path / '.clean-report.json'
        json.dump(results, report_path.open('w'), indent=2)
        
        return results

    def _clean_file(self, file: Path, check_only: bool):
        original = file.read_text()
        
        # 1. Imports sortieren
        cleaned = subprocess.run(
            ['isort', '--check-only' if check_only else '-q', str(file)],
            capture_output=True
        )
        
        # 2. Formatieren mit Black
        cleaned = subprocess.run(
            ['black', '--check' if check_only else '--quiet', str(file)],
            capture_output=True
        )
        
        # 3. AST-Analyse
        analyzer = CodeAnalyzer()
        analyzer.analyze_file(file)
        
        return {
            'issues': analyzer.issues,
            'fixed': 1 if original != file.read_text() else 0
        }

⚡ Pre-Commit-Hook in 15 Minuten eingerichtet.

📞 02406 803 7603 ✉️ info@computerkumpel.de

Sauberer Code, automatisch. Jeden Commit.

Lassen Sie uns Ihre Code-Qualität auf das nächste Level heben.

🔍
Code-Audit
Wir analysieren Ihre Codebase auf Smells, Dead Code und Verbesserungspotenzial.
⚙️
Tooling-Setup
Clean-Pipeline inkl. Pre-Commit-Hooks und CI/CD-Integration — eingerichtet in 1 Tag.
🎓
Team-Workshop
Clean-Code-Praktiken für Ihr Team — Hands-on mit Ihren eigenen Projekten.
📞 02406 803 7603 ✉️ info@computerkumpel.de