Інтерфейс операційної системи

Модуль os має з десяток функцій для взаємодії з операційною системою:

>>> import os
>>> os.system('time 0:02')
0
>>> os.getcwd() # Повертає поточну робочу директорію
'C:\\Python24'
>>> os.chdir('/server/accesslogs')

Пам'ятайте, що слід використовувати "import os" замість "from os import *". Це дозволить запобігти затіненню функцією os.open() вбудованої функції open(), що значно відрізняються між собою.

Вбудовані функції dir() та help() є дуже корисними для отримання допомоги при роботі з такими великими модулями як os:

>>> import os
>>> dir(os)
<повертає список усіх функції модуля>
>>> help(os)
<видає підручник, створений за допомогою документаційних рядків модуля>

Для щоденних потреб, пов'язаних з файлами та директоріями, модуль shutil надає інтерфейс більш високого рівня, що надає простоту використання:

>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db') # копіювання
>>> shutil.move('/build/executables', 'installdir') # перестановка

Шаблони розширення файлових назв

Модуль glob містить функцію, що дозволяє створювати списки файлів за допомогою шаблонів розширення, застосованих до директорій:

>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']

Аргументи командного рядка

Скрипти часто використовують аргументи, подані з командного рядка. Ці аргументи зберігаються у вигляді списку атрибута argv, що знаходиться в модулі sys. Наприклад, якщо з командного рядка було запущено команду "python demo.py one two three", то ми можемо отримати такий вивід:

>>> import sys
>>> print sys.argv
['demo.py', 'one', 'two', 'three']

Модуль getopt оброблює sys.argv на основі конвенцій юніксової функції getopt(). Потужнішу і гнучкішу обробку командного рядка можна знайти у модулі  optparse.

Переспрямування виводу помилок та вихід із програми

Модуль sys має також атрибути stdin, stdout та stderr ("стандартний ввід", "стандартний вивід" та "стандартний вивід помилок" відповідно ). Останній корисний для виводу попереджень і помилок при переспрямуванні stdout:

>>> sys.stderr.write('Попередження: файл для запису не знайдено; створюється новий файл')
Попередження: файл для запису не знайдено; створюється новий файл

Найпростіший шлях виходу з програми - це виклик "sys.exit()".

Пошук за шаблоном

Модуль re містить утиліти регулярних виразів для пошуку за шаблоном всередині ланцюжків. Регулярні вирази надають компактні оптимальні вирішення при застосуванні доволі складних правил пошуку:

>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'

Якщо потрібні лише простенькі маніпуляції, то найліпше застосовувати методи ланцюжків, які набагато простіше читати та зневаджувати:

>>> 'tea for too'.replace('too', 'two')
'tea for two'

Математика

Модуль math надає можливість доступу до функцій бібліотеки C для роботи з дробовими числами:

>>> import math
>>> math.cos(math.pi / 4.0)
0.70710678118654757
>>> math.log(1024, 2)
10.0

Модуль random містить утиліти для роботи з випадковими числами:

>>> import random
>>> print random.choice(['яблуко', 'груша', 'банан'])
'яблуко'
>>> random.sample(xrange(100), 10)   # вибір без заміщення
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()    # випадкове число з рухомою комою
0.17970987693706186
>>> random.randrange(6)    # випадкове ціле число, вибране з послідовності range(6)
4

Доступ до інтернету

Існують кілька модулів для доступу до інтернету та обробки його протоколів. Два найпростіші - це urllib2 (для отримання даних з інтернет-адрес) та smtplib для відправлення електронної пошти:

>>> import urllib2
>>> for line in urllib2.urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
... if 'EST' in line:      # шукаємо Eastern Standard Time
...     print line

<BR>Nov. 25, 09:43:32 PM EST

>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@tmp.org', 'jceasar@tmp.org',
"""To: jceasar@tmp.org
From: soothsayer@tmp.org

Beware the Ides of March.
""")
>>> server.quit()

Час і число

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

# створення та форматування чисел дуже просте
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y or %d%b %Y is a %A on the %d day of %B")
'12-02-03 or 02Dec 2003 is a Tuesday on the 02 day of December'

# часові дані придатні для застосування календарної арифметики
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368

Ущільнення даних

Поширені формати ущільнення та архівації даних напряму підтримуються такими модулями як zlib, gzip, bz2, zipfile та tarfile.

>>> import zlib
>>> s = 'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
'witch which has which witches wrist watch'
>>> zlib.crc32(t)
-1438085031

Обчислення продуктивності

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

Наприклад, можливо комусь захотілося використовувати кортежі замість більш традиційного способу обміну величин двох змінних. Модуль timeit швидко демонструє, що традиційний спосіб є набагато швидшим:

>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.60864915603680925
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.8625194857439773

На відміну від високого рівня детальності модуля timeit, модулі profile та pstats мають інструменти для ідентифікації критичних ділянок коду у більших блоках коду.

Контроль якості

Один із способів для створення якісного програмного забезпечення - це написання спеціальних тестів для кожної функції, і часте використання цих тестів під час процесу розробки.

Модуль doctest має спеціальні інструменти для сканування модуля та перевірки тестів, що вказані в рядках документації. Створення ж тестів - дуже просте і полягає у копіюванні та вставці типового виклику функції та її результату в рядок документації. Додання прикладу вдосконалює документацію а також дозволяє модулю doctest перевірити, чи відповідає код документації:

def average(values):
    """Виводить середнє арифметичне для даного списку чисел.

    >>> print average([20, 30, 70])
    40.0
    """
    return sum(values, 0.0) / len(values)

import doctest
doctest.testmod()   # автоматично перевірити тести

Модуль unittest є дещо складнішим за doctest, але натомість дозволяє провести більш ґрунтовне тестування за допомогою правил, що здебільшого задаються в окремому файлі:

import unittest

class TestStatisticalFunctions(unittest.TestCase):

    def test_average(self):
        self.assertEqual(average([20, 30, 70]), 40.0)
        self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
        self.assertRaises(ZeroDivisionError, average, [])
        self.assertRaises(TypeError, average, 20, 30, 70)

unittest.main() # Виклик з командного рядка запускає всі тести

Батарейки додаються

Коротко філософію Пітона можна висловити так: "батарейки додаються". Це найкраще видно через складні та потужні властивості більших пакетів.

Зокрема:

  • Модулі xmlrpclib та SimpleXMLRPCServer роблять розробку викликів віддалених процедур досить тривіальною справою. Не зважаючи на назви, їхнє використання не потребує спеціальних навичок роботи з XML.
  • Пакет email - це бібліотека для роботи з електронними повідомленнями, що включає MIME та інші документи повідомлень, які визначаються у RFC 2822. На відміну від smtplib та poplib, які просто надсилають та отримують повідомлення, цей пакет має повний інструментарій для створення та кодування складних структур повідомлень (включно з доданими документами) та для імплементації інтернет-кодувань та протоколів заголовків.
  • Пакети xml.dom та xml.sax мають потужну підтримку для обробки цього популярного формату для обміну даними. Подібно до нього модуль csv підтримує зчитування і запис розповсюдженого формату бази даних. Разом ці модулі та пакети значно спрощують обмін даними між Пітоном та іншими програмами та утилітами.
  • Кілька модулів присвячено інтернаціоналізації, зокрема gettext, locale та codecs.