| name | clean-general |
| description | Use when writing, fixing, editing, or reviewing Python code quality. Enforces Clean Code's core principles—DRY, single responsibility, clear intent, no magic numbers, proper abstractions. |
| when_to_use | Also trigger on: duplicated logic across files or branches (G5), magic numbers or hardcoded values (G25), long if/elif chains that should be polymorphism (G23), chained property access like `a.b.c.d` (G36), functions juggling multiple responsibilities (G30), clever one-liners whose intent is not obvious (G16).
|
General Clean Code Principles
Critical Rules
G5: DRY (Don't Repeat Yourself)
Every piece of knowledge has one authoritative representation.
tax_rate = 0.0825
ca_total = subtotal * 1.0825
ny_total = subtotal * 1.07
TAX_RATES = {"CA": 0.0825, "NY": 0.07}
def calculate_total(subtotal: float, state: str) -> float:
return subtotal * (1 + TAX_RATES[state])
G16: No Obscured Intent
Don't be clever. Be clear.
return (x & 0x0F) << 4 | (y & 0x0F)
return pack_coordinates(x, y)
G23: Prefer Polymorphism to If/Else
def calculate_pay(employee):
if employee.type == "SALARIED":
return employee.salary
elif employee.type == "HOURLY":
return employee.hours * employee.rate
elif employee.type == "COMMISSIONED":
return employee.base + employee.commission
class SalariedEmployee:
def calculate_pay(self): return self.salary
class HourlyEmployee:
def calculate_pay(self): return self.hours * self.rate
class CommissionedEmployee:
def calculate_pay(self): return self.base + self.commission
G25: Replace Magic Numbers with Named Constants
if elapsed_time > 86400:
...
SECONDS_PER_DAY = 86400
if elapsed_time > SECONDS_PER_DAY:
...
G30: Functions Should Do One Thing
If you can extract another function, your function does more than one thing.
G36: Law of Demeter (Avoid Train Wrecks)
output_dir = context.options.scratch_dir.absolute_path
output_dir = context.get_scratch_dir()
Enforcement Checklist
When reviewing AI-generated code, verify: