Модулі Python

Модуль в мові Python представляє окремий файл з кодом, який можна повторно використовувати в інших програмах.

Для створення модуля необхідно створити власне файл з розширенням *.py, який буде представляти модуль. Назва файлу буде представляти назву модуля. Потім в цьому файлі треба визначити одну або кілька функцій.

Нехай основний файл програми буде називатися hello.py. І ми хочемо підключити до нього зовнішні модулі.

Для цього спочатку визначимо новий модуль: створимо новий файл, який назвемо account.py в тій же папці, де знаходиться hello.py. Якщо використовується PyCharm або інша IDE, то обидва файли просто поміщаються в один проект.

Відповідно модуль буде називатися account. І визначимо в ньому наступний код:

def calculate_income(rate, money, month):  
    if money <= 0:  
        return 0      
    for i in range(1, month+1):  
        money = round(money + money * rate / 100 / 12, 2)  
    return money

Тут визначена функція calculate_income, яка в якості параметрів отримує процентну ставку вкладу, суму вкладу та період, на який робиться внесок, і вираховує суму, яка вийде в кінці цього періоду.

У файлі hello.py використовуємо даний модуль:

#! Програма банківський рахунок  
import account     

rate = int (input ("введіть процентну ставку: "))  
money = int(input("Введіть суму: "))  
period = int(input("Введіть період ведення рахунку в місяцях: "))      

result = account.calculate_income(rate, money, period)  
print("Параметри рахунку:\n", "Сума ", money, "\n", "Ставка ", rate, "\n",  
        "Період ", period, "\n", "Сума на рахунку в кінці періоду: ", result)  

Для використання модуля його треба імпортувати з допомогою оператора import, після якого вказується ім'я модуля: import account.

Щоб звертатися до функціональності модуля, нам потрібно отримати його простір імен. За замовчуванням воно буде збігатися з ім'ям модуля, тобто в нашому випадку також буде називатися account.

Отримавши простір імен модуля, ми зможемо звернутися до його функцій за схемою простір_імен.функція:

account.calculate_income(rate, money, period)  

І після цього ми можемо запустити головний скрипт hello.py і він задіює модуль account.py. Зокрема, консольний вивід міг би бути таким:

Введіть процентну ставку: 10
Введіть суму: 300000
Введіть період ведення рахунку в місяцях: 6
Параметри рахунку:
 Сума: 300000 
 Ставка: 10 
 Період: 6 
 Сума на рахунку в кінці періоду: 315315.99

Налаштування простору імен

За замовчуванням при імпорті модуля він доступний через однойменний простір імен. Однак ми можемо перевизначити цю поведінку. Так, ключове слово as дозволяє зіставити модуль з іншим простором імен. Наприклад:

import account as acc     

#...............     

result = acc.calculate_income(rate, money, period)  

В даному випадку простір імен буде називатися acc.

Інший варіант налаштування передбачає імпорт функціональності модуля в глобальний простір імен поточного модуля за допомогою ключового слова from:

from account import calculate_income         

#...............         

result = calculate_income(rate, money, period)

В даному випадку ми імпортуємо з модуля account в глобальний простір імен функцію calculate_income. Тому ми зможемо її використовувати без вказівки простору імен модуля, як якщо б вона була визначена в цьому ж файлі.

Якщо б у модулі account було б кілька функцій, то могли б їх імпортувати в глобальний простір імен одним виразом:

from account import *     

#...............     

result = calculate_income(rate, money, period)  

Але варто відзначити, що імпорт в глобальний простір імен загрожує колізіями імен функцій. Наприклад, якщо у нас тому ж файлі визначена функція з тим же ім'ям, то при виклику функції ми можемо отримати помилку. Тому краще уникати використання імпорту в глобальний простір імен.

Ім'я модуля

У прикладі вище модуль hello.py, який є головним, використовує модуль account.py. При запуску модуля hello.py програма виконає всю необхідну роботу. Однак, якщо ми запустимо окремо модуль account.py сам по собі, то нічого на консолі не побачимо. Адже модуль просто визначає функцію і невиконує ніяких інших дій. Але ми можемо зробити так, щоб модуль account.py міг використовуватися як сам по собі, так і підключатися в інші модулі.

При виконанні модуля середовище визначає його ім'я і присвоює його глобальної змінної __name__ (з обох боків два підкреслення). Якщо модуль є запускається, то його ім'я дорівнює _ _ main _ _ (також по два підкреслення з кожного боку). Якщо модуль використовується в іншому модулі, то в момент виконання його ім'я аналогічно назві файлу без розширення py. І ми можемо це використовувати. Так, змінимо вміст файлу account.py:

def calculate_income(rate, money, month):  
    if money <= 0:  
        return 0     

    for i in range(1, month+1):  
        money = round(money + money * rate / 100 / 12, 2)  
    return money  

def main():  
    rate = 10  
    money = 100000  
    period = 12     

    result = calculate_income(rate, money, period)  
    print("Параметри рахунку:\n", "Сума ", money, "\n", "Ставка ", rate, "\n",  
          "Період ", period, "\n", "Сума на рахунку в кінці періоду: ", result)  

if __name__=="__main__":  
    main()  

Крім того, для тестування функції визначена головна функція main. І ми можемо відразу запустити файл account.py окремо від усіх і протестувати код.
Слід звернути увагу на виклик функції main:

if __name__=="__main__":  
    main()  

Змінна __name__ вказує на ім'я модуля. Для головного модуля, який безпосередньо запускається, ця змінна завжди буде мати значення __main__ незалежно від імені файлу.

Тому, якщо ми будемо запускати скрипт account.py окремо, сам по собі, то Python присвоїть змінній __name__ значення __main__, далі у вираженні if викличе функцію main з цього файлу.

Однак якщо ми будемо запускати інший скрипт, а цей - account.py - будемо підключати в якості допоміжного, для account.py змінна __name__ буде мати значення account. І відповідно метод main у файлі account.py не буде працювати.

Даний підхід з перевіркою імені модуля є більш рекомендованим підходом, ніж просто виклик методу main.

У файлі hello.py також можна зробити перевірку на те, чи є модуль головним (хоча в прицніпі це необов'язково):

#! Програма банківський рахунок  
import account    

def main():  
    rate = int (input ("введіть процентну ставку: "))  
    money = int(input("Введіть суму: "))  
    period = int(input("Введіть період ведення рахунку в місяцях: "))     

    result = account.calculate_income(rate, money, period)  
    print("Параметри рахунку:\n", "Сума ", money, "\n", "Ставка ", rate, "\n",  
          "Період ", period, "\n", "Сума на рахунку в кінці періоду: ", result)               

if __name__ == "__main__":  
    main()