Appearance
Kapitel 18: Code-Standards und Sicherheit
🎯 Lernziele
In diesem Kapitel wirst du:
- Bewährte Praktiken für Python-Code kennenlernen
- Sicherheitsüberlegungen bei der Python-Programmierung verstehen
- Fehlerbehebungsstrategien erlernen
- Werkzeuge zur Code-Analyse kennenlernen
18.1 Bewährte Praktiken (Best Practices)
📏 PEP 8 - Der Python Style Guide
PEP 8 ist der offizielle Style Guide für Python-Code. Hier sind die wichtigsten Regeln:
1. Einrückung (Indentation)
python
# Richtig: 4 Leerzeichen
def funktion():
if True:
return True
# Falsch: Tabs oder andere Einrücktiefen
def funktion():
if True: # Falsch: 2 Leerzeichen
return True2. Maximale Zeilenlänge
python
# Richtig: Zeilen unter 79-100 Zeichen
def lange_funktion_mit_vielen_parametern(
parameter1, parameter2, parameter3,
parameter4, parameter5
):
pass
# Lange Strings aufteilen
langer_string = (
"Dies ist ein sehr langer String, der "
"auf mehrere Zeilen aufgeteilt wurde."
)3. Leerzeichen in Ausdrücken
python
# Richtig
x = 1
y = 2
lange_liste = [1, 2, 3, 4, 5]
# Falsch
x=1
y = 2
lange_liste = [ 1,2,3,4,5 ]4. Benennungskonventionen
python
# Variablen und Funktionen: snake_case
meine_variable = 10
def berechne_durchschnitt(liste):
pass
# Klassen: PascalCase
class MeineKlasse:
pass
# Konstanten: UPPER_CASE
MAX_WERT = 100
PI = 3.14159
# Private Attribute: _unterstrich
class Beispiel:
def __init__(self):
self._private_attribut = 42📝 Dokumentationsstrings (Docstrings)
python
def berechne_fläche(länge, breite):
"""
Berechnet die Fläche eines Rechtecks.
Argumente:
länge (float): Die Länge des Rechtecks
breite (float): Die Breite des Rechtecks
Rückgabe:
float: Die berechnete Fläche
"""
return länge * breite
class Person:
"""
Eine Klasse zur Repräsentation einer Person.
Attribute:
name (str): Der Name der Person
alter (int): Das Alter der Person
"""
def __init__(self, name, alter):
self.name = name
self.alter = alter✅ Code-Linting mit pylint und flake8
bash
# Installation
pip install pylint flake8
# Verwendung
pylint meine_datei.py
flake8 meine_datei.py18.2 Sicherheitsüberlegungen
🔒 Häufige Sicherheitsrisiken
1. SQL-Injection
python
# UNSICHER!
def unsichere_abfrage(benutzer_eingabe):
abfrage = f"SELECT * FROM benutzer WHERE name = '{benutzer_eingabe}'"
cursor.execute(abfrage)
# SICHER!
def sichere_abfrage(benutzer_eingabe):
abfrage = "SELECT * FROM benutzer WHERE name = ?"
cursor.execute(abfrage, (benutzer_eingabe,))2. Command Injection
python
# UNSICHER!
import os
def unsichere_dateiausführung(dateiname):
os.system(f"ls -l {dateiname}")
# SICHER!
import subprocess
def sichere_dateiausführung(dateiname):
subprocess.run(["ls", "-l", dateiname])3. Unsichere Deserialisierung
python
# UNSICHER! (Verwendung von pickle mit nicht-vertrauenswürdigen Daten)
import pickle
def unsicheres_laden(datei_pfad):
with open(datei_pfad, 'rb') as f:
daten = pickle.load(f) # Gefährlich!
return daten
# SICHER! (Verwendung von JSON)
import json
def sicheres_laden(datei_pfad):
with open(datei_pfad, 'r') as f:
daten = json.load(f)
return daten4. Hardcoded Secrets
python
# UNSICHER!
api_key = "mein_geheimer_schlüssel123"
# SICHER!
import os
api_key = os.environ.get("API_KEY")🛡️ Sicherheits-Best Practices
- Verwende immer parametrisierte Abfragen für Datenbanken
- Validiere und bereinige alle Benutzereingaben
- Verwende Umgebungsvariablen für sensible Daten
- Aktualisiere Abhängigkeiten regelmäßig
- Verwende HTTPS für API-Aufrufe
- Implementiere ordnungsgemäße Authentifizierung und Autorisierung
18.3 Fehlerbehebung und Debugging
🐛 Häufige Fehlertypen
1. Syntaxfehler
python
# Syntaxfehler: Falsche Einrückung
def funktion():
print("Hallo") # IndentationError
# Syntaxfehler: Fehlendes Doppelpunkt
if True # SyntaxError
print("Hallo")2. Laufzeitfehler (Runtime Errors)
python
# ZeroDivisionError
zahl = 10 / 0 # ZeroDivisionError
# TypeError
zahl = 10 + "5" # TypeError
# IndexError
liste = [1, 2, 3]
element = liste[5] # IndexError
# KeyError
wörterbuch = {"a": 1}
wert = wörterbuch["b"] # KeyError3. Logische Fehler
python
# Logischer Fehler: Falsche Bedingung
alter = 20
if alter >= 18:
print("Minderjährig") # Falsche Ausgabe!
else:
print("Volljährig")🔍 Debugging-Techniken
1. Print-Debugging
python
def berechnung(a, b):
ergebnis = a + b
print(f"Debug: a={a}, b={b}, ergebnis={ergebnis}") # Debug-Ausgabe
return ergebnis2. Verwendung des pdb-Debuggers
python
import pdb
def problematische_funktion():
x = 10
y = 0
pdb.set_trace() # Debugger-Haltepunkt
ergebnis = x / y # ZeroDivisionError
return ergebnis3. Verwendung einer IDE (PyCharm, VS Code)
- Setze Haltepunkte (Breakpoints)
- Untersuche Variablenwerte
- Schreite durch den Code zeilenweise
📊 Logging
python
import logging
# Logging konfigurieren
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(message)s',
filename='app.log',
filemode='w'
)
# Verschiedene Log-Level
logging.debug("Dies ist eine Debug-Nachricht")
logging.info("Dies ist eine Info-Nachricht")
logging.warning("Dies ist eine Warnung")
logging.error("Dies ist eine Fehlermeldung")
logging.critical("Dies ist eine kritische Meldung")
def division(a, b):
try:
ergebnis = a / b
logging.info(f"Division erfolgreich: {a} / {b} = {ergebnis}")
return ergebnis
except ZeroDivisionError:
logging.error(f"Division durch Null: {a} / {b}")
return None18.4 Nützliche Werkzeuge
🔧 Statische Code-Analyse
pylint- Überprüft Code auf Fehler und Style-Verstößeflake8- Kombiniert PyFlakes, pycodestyle und McCabemypy- Statische Typüberprüfung für Pythonbandit- Sucht nach Sicherheitsproblemen in Python-Code
📦 Virtuelle Umgebungen
bash
# Erstellen einer virtuellen Umgebung
python -m venv mein_venv
# Aktivieren der virtuellen Umgebung
# Windows:
mein_venv\Scripts\activate
# macOS/Linux:
source mein_venv/bin/activate
# Deaktivieren
deactivate📋 Requirements-Datei
txt
# requirements.txt
flask==2.0.1
numpy>=1.21.0
pandas>=1.3.0
requests>=2.26.0bash
# Installation aller Abhängigkeiten
pip install -r requirements.txt
# Generieren einer requirements.txt
pip freeze > requirements.txt📝 Zusammenfassung
In diesem Kapitel hast du gelernt:
- ✅ Die bewährten Praktiken für Python-Code (PEP 8)
- ✅ Sicherheitsüberlegungen und häufige Risiken
- ✅ Techniken zur Fehlerbehebung und Debugging
- ✅ Nützliche Werkzeuge für die Python-Entwicklung
🎯 Übung
- Analysiere deinen eigenen Code mit
pylintoderflake8 - Implementiere ein sicheres Datenbankabfrage-Beispiel
- Verwende den
pdb-Debugger, um einen Fehler in deinem Code zu finden - Erstelle eine
requirements.txtfür eines deiner Projekte
⏭️ Nächstes Kapitel
In Kapitel 19 werden wir häufige Fehler und Fallen in Python behandeln - wie man sie vermeidet und behebt!
