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.
🧼 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.
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.