Moduły i pakiety

Moduły i pakiety w Pythonie

Moduły i pakiety pozwalają na organizację kodu, reużywalność i lepszą strukturę projektów.

Co to są moduły?

Moduł to plik Python z rozszerzeniem .py, który zawiera funkcje, klasy i zmienne. Możesz go importować w innych plikach.

Tworzenie własnego modułu:

Stwórz plik math_utils.py:

# math_utils.py
PI = 3.14159

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

def multiply(a, b):
    return a * b

def divide(a, b):
    if b == 0:
        raise ValueError("Nie można dzielić przez zero!")
    return a / b

def power(base, exponent):
    return base ** exponent

class Calculator:
    def __init__(self):
        self.history = []
    
    def calculate(self, operation, a, b):
        if operation == "add":
            result = add(a, b)
        elif operation == "subtract":
            result = subtract(a, b)
        elif operation == "multiply":
            result = multiply(a, b)
        elif operation == "divide":
            result = divide(a, b)
        else:
            raise ValueError("Nieznana operacja")
        
        self.history.append(f"{a} {operation} {b} = {result}")
        return result
    
    def get_history(self):
        return self.history

Importowanie modułów:

# Import całego modułu
import math_utils

result = math_utils.add(5, 3)
print(result)  # 8

# Import konkretnych funkcji
from math_utils import add, subtract, PI

print(add(10, 5))      # 15
print(subtract(10, 5)) # 5
print(PI)              # 3.14159

# Import z aliasem
import math_utils as mu

result = mu.multiply(4, 6)
print(result)  # 24

# Import wszystkiego (niezalecane)
from math_utils import *

result = power(2, 8)
print(result)  # 256

Wbudowane moduły Pythona:

Python ma wiele wbudowanych modułów:

# Moduł math - funkcje matematyczne
import math

print(math.sqrt(16))      # 4.0
print(math.ceil(3.7))     # 4
print(math.floor(3.7))    # 3
print(math.pi)            # 3.141592653589793

# Moduł random - liczby losowe
import random

print(random.randint(1, 10))  # Losowa liczba od 1 do 10
print(random.choice(['a', 'b', 'c']))  # Losowy element z listy
print(random.random())        # Losowa liczba od 0 do 1

# Moduł datetime - praca z datami
from datetime import datetime, timedelta

now = datetime.now()
print(now)  # Aktualna data i czas

tomorrow = now + timedelta(days=1)
print(tomorrow)  # Jutro

# Moduł os - operacje systemowe
import os

print(os.getcwd())        # Aktualny katalog
print(os.listdir('.'))    # Lista plików w katalogu
print(os.path.exists('test.txt'))  # Czy plik istnieje

Tworzenie pakietów:

Pakiet to katalog zawierający moduły i plik __init__.py.

# Struktura pakietu:
# mypackage/
#     __init__.py
#     module1.py
#     module2.py
#     subpackage/
#         __init__.py
#         module3.py

# __init__.py - może być pusty lub zawierać kod inicjalizacyjny
# __init__.py
from .module1 import function1
from .module2 import Class1

__version__ = "1.0.0"
__author__ = "Twój Name"

# module1.py
def function1():
    return "Hello from module1"

# module2.py
class Class1:
    def __init__(self):
        self.name = "Class1"
    
    def greet(self):
        return f"Hello from {self.name}"

Importowanie z pakietów:

# Import z pakietu
import mypackage.module1
from mypackage import module2
from mypackage.module1 import function1

# Użycie
result = mypackage.module1.function1()
print(result)  # Hello from module1

obj = module2.Class1()
print(obj.greet())  # Hello from Class1

print(function1())  # Hello from module1

# Import z subpakietu
from mypackage.subpackage import module3
from mypackage.subpackage.module3 import some_function

Instalowanie pakietów z PyPI:

Używając pip możesz instalować pakiety z Python Package Index (PyPI):

# W terminalu:
# pip install requests
# pip install numpy
# pip install pandas

# W kodzie:
import requests

# Pobieranie danych z API
response = requests.get('https://api.github.com/users/octocat')
data = response.json()
print(data['login'])  # octocat

import numpy as np

# Operacje na tablicach
arr = np.array([1, 2, 3, 4, 5])
print(arr * 2)  # [2 4 6 8 10]
print(np.mean(arr))  # 3.0

import pandas as pd

# Praca z danymi
df = pd.DataFrame({
    'Name': ['Jan', 'Anna', 'Piotr'],
    'Age': [25, 30, 28],
    'City': ['Warszawa', 'Kraków', 'Gdańsk']
})
print(df)

Wirtualne środowiska:

Wirtualne środowiska pozwalają na izolację zależności projektów:

# Tworzenie wirtualnego środowiska
# python -m venv myenv

# Aktywacja (Windows):
# myenv\Scripts\activate

# Aktywacja (Linux/Mac):
# source myenv/bin/activate

# Instalowanie pakietów w środowisku
# pip install package_name

# Dezaktywacja
# deactivate

# Lista zainstalowanych pakietów
# pip list

# Zapisanie zależności
# pip freeze > requirements.txt

# Instalowanie z pliku requirements.txt

Dobre praktyki:

  • Używaj opisowych nazw modułów i pakietów
  • Umieszczaj kod wykonywalny w bloku if __name__ == "__main__":
  • Unikaj importowania wszystkiego z from module import *
  • Używaj wirtualnych środowisk dla każdego projektu
  • Dokumentuj swoje moduły i pakiety
  • Używaj __init__.py do kontrolowania importów

Przykład z __name__:

# mymodule.py
def my_function():
    return "Hello from my_function"

if __name__ == "__main__":
    # Ten kod wykona się tylko gdy uruchomimy plik bezpośrednio
    print("Uruchamiam moduł bezpośrednio")
    print(my_function())
else:
    # Ten kod wykona się gdy moduł zostanie zaimportowany
    print("Moduł został zaimportowany")

# Gdy uruchomimy: python mymodule.py
# Wyświetli: "Uruchamiam moduł bezpośrednio" i "Hello from my_function"

# Gdy zaimportujemy: import mymodule
# Wyświetli tylko: "Moduł został zaimportowany"

Ćwiczenie:

Stwórz własny moduł z funkcjami matematycznymi i zaimportuj go w głównym programie.

Uwaga:

Przykłady z zewnętrznymi bibliotekami (requests, numpy, pandas) nie działają w edytorze online – wymagają instalacji w lokalnym środowisku Python. Niektóre wbudowane moduły (os, datetime) również mogą nie działać w edytorze online.

Brak odpowiedzi

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *