diff --git a/python-code-quality/README.md b/python-code-quality/README.md new file mode 100644 index 0000000000..aa07e5ca38 --- /dev/null +++ b/python-code-quality/README.md @@ -0,0 +1,3 @@ +# Python Code Quality: Best Practices and Tools + +This folder provides the code examples for the Real Python tutorial [Python Code Quality: Best Practices and Tools](https://realpython.com/python-code-quality/). diff --git a/python-code-quality/compilance.py b/python-code-quality/compilance.py new file mode 100644 index 0000000000..fbcd2f68fe --- /dev/null +++ b/python-code-quality/compilance.py @@ -0,0 +1,7 @@ +# def calcTotal(price,taxRate=0.05): return price*(1+taxRate) + + +def calculate_price_with_taxes( + base_price: float, tax_rate: float = 0.05 +) -> float: + return base_price * (1 + tax_rate) diff --git a/python-code-quality/documentation.py b/python-code-quality/documentation.py new file mode 100644 index 0000000000..6aaca3dd33 --- /dev/null +++ b/python-code-quality/documentation.py @@ -0,0 +1,18 @@ +# def multiply(a, b): +# return a * b + + +def multiply(a: float, b: float) -> float: + """Multiply two numbers + + Args: + a (float): First number. + b (float): Second number. + + Returns: + float: Product of a and b. + """ + return a * b + + +print(multiply(2, 3)) diff --git a/python-code-quality/efficiency_v1.py b/python-code-quality/efficiency_v1.py new file mode 100644 index 0000000000..3439caa41e --- /dev/null +++ b/python-code-quality/efficiency_v1.py @@ -0,0 +1,14 @@ +from time import perf_counter + + +def fibonacci_of(n): + if n in {0, 1}: + return n + return fibonacci_of(n - 1) + fibonacci_of(n - 2) + + +start = perf_counter() +[fibonacci_of(n) for n in range(35)] +end = perf_counter() + +print(f"Execution time: {end - start:.2f} seconds") diff --git a/python-code-quality/efficiency_v2.py b/python-code-quality/efficiency_v2.py new file mode 100644 index 0000000000..d4814836a3 --- /dev/null +++ b/python-code-quality/efficiency_v2.py @@ -0,0 +1,17 @@ +from time import perf_counter + +cache = {0: 0, 1: 1} + + +def fibonacci_of(n): + if n in cache: + return cache[n] + cache[n] = fibonacci_of(n - 1) + fibonacci_of(n - 2) + return cache[n] + + +start = perf_counter() +[fibonacci_of(n) for n in range(35)] +end = perf_counter() + +print(f"Execution time: {end - start:.2f} seconds") diff --git a/python-code-quality/functionality.py b/python-code-quality/functionality.py new file mode 100644 index 0000000000..eb2262cf9c --- /dev/null +++ b/python-code-quality/functionality.py @@ -0,0 +1,11 @@ +# def add_numbers(a, b): +# return a + b + + +def add_numbers(a: int | float, b: int | float) -> int | float: + a, b = float(a), float(b) + return a + b + + +print(add_numbers(2, 3)) +print(add_numbers(2, "3")) diff --git a/python-code-quality/input_v1.py b/python-code-quality/input_v1.py new file mode 100644 index 0000000000..4c801102dd --- /dev/null +++ b/python-code-quality/input_v1.py @@ -0,0 +1,5 @@ +user_input = "Amount to withdraw? " +amount = int(input(user_input)) +available_balance = 1000 +print(f"Here are your {amount:.2f}USD") +print(f"Your available balance is {available_balance - amount:.2f}USD") diff --git a/python-code-quality/input_v2.py b/python-code-quality/input_v2.py new file mode 100644 index 0000000000..401de93fdf --- /dev/null +++ b/python-code-quality/input_v2.py @@ -0,0 +1,10 @@ +user_input = "Amount to withdraw? " +amount = int(input(user_input)) +available_balance = 1000 +if amount > available_balance: + print("Insufficient funds") + amount = 0 +else: + print(f"Here are your {amount:.2f}USD") + +print(f"Your available balance is {available_balance - amount:.2f}USD") diff --git a/python-code-quality/maintainability.py b/python-code-quality/maintainability.py new file mode 100644 index 0000000000..dc51eb319b --- /dev/null +++ b/python-code-quality/maintainability.py @@ -0,0 +1,18 @@ +def process(numbers): + cleaned = [number for number in numbers if number >= 0] + return sum(cleaned) + + +print(process([1, 2, 3, -1, -2, -3])) + + +def clean_data(numbers: list[int]) -> list[int]: + return [number for number in numbers if number >= 0] + + +def calculate_total(numbers: list[int]) -> int: + return sum(numbers) + + +cleaned = clean_data([1, 2, 3, -1, -2, -3]) +print(calculate_total(cleaned)) diff --git a/python-code-quality/readability.py b/python-code-quality/readability.py new file mode 100644 index 0000000000..fe7811f913 --- /dev/null +++ b/python-code-quality/readability.py @@ -0,0 +1,10 @@ +def ca(w, h): + return w * h + + +def calculate_rectangle_area(width: float, height: float) -> float: + return width * height + + +print(ca(12, 20)) +print(calculate_rectangle_area(12, 20)) diff --git a/python-code-quality/reusability.py b/python-code-quality/reusability.py new file mode 100644 index 0000000000..b065b95f53 --- /dev/null +++ b/python-code-quality/reusability.py @@ -0,0 +1,6 @@ +# def greet_alice(): +# return "Hello, Alice!" + + +def greet(name: str) -> str: + return f"Hello, {name}!" diff --git a/python-code-quality/robustness.py b/python-code-quality/robustness.py new file mode 100644 index 0000000000..6b09d6655f --- /dev/null +++ b/python-code-quality/robustness.py @@ -0,0 +1,13 @@ +# def divide_numbers(a, b): +# return a / b + + +def divide_numbers(a: float, b: float) -> float | None: + try: + return a / b + except ZeroDivisionError: + print("Error: can't divide by zero") + + +print(divide_numbers(10, 2)) +print(divide_numbers(3, 0)) diff --git a/python-code-quality/scalability.py b/python-code-quality/scalability.py new file mode 100644 index 0000000000..367df0b6af --- /dev/null +++ b/python-code-quality/scalability.py @@ -0,0 +1,10 @@ +# def sum_even_numbers(numbers): +# even_numbers = [number for number in numbers if number % 2 == 0] +# return sum(even_numbers) + + +def sum_even_numbers(numbers): + return sum(number for number in numbers if number % 2 == 0) + + +sum_even_numbers([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) diff --git a/python-code-quality/testability.py b/python-code-quality/testability.py new file mode 100644 index 0000000000..b30de831e4 --- /dev/null +++ b/python-code-quality/testability.py @@ -0,0 +1,19 @@ +# import pytest + +# def greet(name): +# print(f"Hello, {name}") + + +# def test_greet(capsys): +# greet("Alice") +# captured = capsys.readouterr() +# assert captured.out.strip() == "Hello, Alice" + + +def greet(name: str) -> str: + return f"Hello, {name}" + + +# Easy to test +def test_greet(): + assert greet("Alice") == "Hello, Alice"