Python پایتون ۳.۱۴
فصل ۱۰

گشتی کوتاه در کتابخانهٔ استاندارد

📖 ۱۲ دقیقه 🎯 متوسط 🔄 ۲۰۲۶

پایتون با کتابخانهٔ استانداردی غنی همراه است که «باتری‌ها همراه هستند» (Batteries Included) را به معنای واقعی کلمه محقق می‌کند. این کتابخانه، ماژول‌هایی برای تقریباً هر نیازی از مدیریت فایل تا ارتباطات شبکه و پردازش داده را در بر می‌گیرد. در این فصل، به‌عنوان یک تور سریع، برخی از پرکاربردترین و مفیدترین ماژول‌های آن را مرور می‌کنیم.

۱۰.۱. رابط سیستم‌عامل

پیمانهٔ os ده‌ها تابع برای تعامل با سیستم‌عامل فراهم می‌کند:

>>> import os
>>> os.getcwd()      # Return the current working directory
'C:\\Python314'
>>> os.chdir('/server/accesslogs')   # Change current working directory
>>> os.system('mkdir today')   # Run the command mkdir in the system shell
0

حتماً از سبک import os به جای from os import * استفاده کنید. این کار باعث می‌شود که os.open() جایگزین (shadowing) تابع درون‌ساخت open() نشود، زیرا عملکرد آن‌ها کاملاً متفاوت است.

توابع درون‌ساخت dir() و help() به‌عنوان ابزارهای کمکی تعاملی برای کار با پیمانه‌های بزرگی مانند os مفید هستند:

>>> import os
>>> dir(os)
<returns a list of all module functions>
>>> help(os)
<returns an extensive manual page created from the module's docstrings>

برای وظایف روزمرهٔ مدیریت فایل و دایرکتوری، پیمانهٔ shutil یک رابط سطح بالاتر و ساده‌تر ارائه می‌دهد:

>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
'archive.db'
>>> shutil.move('/build/executables', 'installdir')
'installdir'

۱۰.۲. الگوهای عام فایل (File Wildcards)

پیمانهٔ glob تابعی برای ایجاد لیست فایل‌ها از طریق جست‌وجوی الگوهای عام در دایرکتوری‌ها فراهم می‌کند:

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

۱۰.۳. آرگومان‌های خط فرمان

اسکریپت‌های کاربردی رایج اغلب نیاز به پردازش آرگومان‌های خط فرمان دارند. این آرگومان‌ها در ویژگی argv از پیمانهٔ sys به‌صورت یک لیست ذخیره می‌شوند. برای مثال، فایل demo.py زیر را در نظر بگیرید:

# File demo.py
import sys
print(sys.argv)

خروجی اجرای دستور python demo.py one two three در خط فرمان به این صورت خواهد بود:

['demo.py', 'one', 'two', 'three']

پیمانهٔ argparse مکانیزم پیشرفته‌تری برای پردازش آرگومان‌های خط فرمان ارائه می‌دهد. اسکریپت زیر یک یا چند نام فایل و یک تعداد اختیاری از خطوط را برای نمایش استخراج می‌کند:

import argparse

parser = argparse.ArgumentParser(
    prog='top',
    description='Show top lines from each file')
parser.add_argument('filenames', nargs='+')
parser.add_argument('-l', '--lines', type=int, default=10)
args = parser.parse_args()
print(args)

وقتی این اسکریپت در خط فرمان با دستور python top.py --lines=5 alpha.txt beta.txt اجرا شود، مقدار args.lines را روی 5 و args.filenames را روی ['alpha.txt', 'beta.txt'] تنظیم می‌کند.

۱۰.۴. تغییر مسیر خروجی خطا و خاتمهٔ برنامه

پیمانهٔ sys همچنین دارای ویژگی‌هایی برای stdin، stdout و stderr است. ویژگی آخر برای انتشار هشدارها و پیام‌های خطا مفید است تا حتی زمانی که stdout تغییر مسیر داده شده است، دیده شوند:

>>> sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one

مستقیم‌ترین راه برای خاتمه دادن به یک اسکریپت، استفاده از sys.exit() است.

۱۰.۵. تطبیق الگوی رشته

پیمانهٔ re ابزارهای عبارت باقاعده (Regular Expression) را برای پردازش پیشرفتهٔ رشته‌ها فراهم می‌کند. برای تطبیق و دستکاری پیچیده، عبارات باقاعده راه‌حل‌های مختصر و بهینه‌ای ارائه می‌دهند:

>>> 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 زیربنایی برای محاسبات اعشاری (floating-point) را فراهم می‌کند:

>>> import math
>>> math.cos(math.pi / 4)
0.7071067811865476
>>> math.log(1024, 2)
10.0

پیمانهٔ random ابزارهایی برای انتخاب‌های تصادفی ارائه می‌دهد:

>>> import random
>>> random.choice(['apple', 'pear', 'banana'])
'apple'
>>> random.sample(range(100), 10)   # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()                 # random float from the interval [0.0, 1.0)
0.17970987693706186
>>> random.randrange(6)             # random integer chosen from range(6)
4

پیمانهٔ statistics ویژگی‌های آماری پایه (مانند میانگین، میانه، واریانس و غیره) داده‌های عددی را محاسبه می‌کند:

>>> import statistics
>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
>>> statistics.mean(data)
1.6071428571428572
>>> statistics.median(data)
1.25
>>> statistics.variance(data)
1.3720238095238095

پروژهٔ SciPy (https://scipy.org) پیمانه‌های بسیاری دیگری برای محاسبات عددی دارد.

۱۰.۷. دسترسی به اینترنت

پیمانه‌های متعددی برای دسترسی به اینترنت و پردازش پروتکل‌های اینترنتی وجود دارد. دو مورد از ساده‌ترین آن‌ها urllib.request برای بازیابی داده از URLها و smtplib برای ارسال ایمیل هستند:

>>> from urllib.request import urlopen
>>> with urlopen('https://docs.python.org/3/') as response:
...     for line in response:
...         line = line.decode()  # Convert bytes to a str
...         if 'updated' in line:
...             print(line.rstrip())  # Remove trailing newline
...
Last updated on Nov 11, 2025 (20:11 UTC).

>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
...                  """To: jcaesar@example.org
... From: soothsayer@example.org
...
... Beware the Ides of March.
... """)
>>> server.quit()

(توجه داشته باشید که مثال دوم نیازمند اجرای یک سرور ایمیل روی localhost است.)

۱۰.۸. تاریخ و زمان

پیمانهٔ datetime کلاس‌هایی برای دستکاری تاریخ و زمان به روش‌های ساده و پیچیده ارائه می‌دهد. اگرچه از محاسبات تاریخ و زمان پشتیبانی می‌شود، اما تمرکز پیاده‌سازی بر استخراج کارآمد اعضا برای قالب‌بندی خروجی و دستکاری است. این پیمانه همچنین از اشیاء آگاه به منطقهٔ زمانی (Timezone-aware) پشتیبانی می‌کند.

>>> # dates are easily constructed and formatted
>>> import datetime as dt
>>> now = dt.date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

>>> # dates support calendar arithmetic
>>> birthday = dt.date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368

۱۰.۹. فشرده‌سازی داده

فرمت‌های رایج بایگانی و فشرده‌سازی داده مستقیماً توسط پیمانه‌هایی شامل zlib، gzip، bz2، lzma، zipfile و tarfile پشتیبانی می‌شوند.

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

۱۰.۱۰. اندازه‌گیری عملکرد

برخی از کاربران پایتون علاقهٔ شدیدی به دانستن عملکرد نسبی رویکردهای مختلف برای یک مسئلهٔ واحد دارند. پایتون ابزاری برای اندازه‌گیری فراهم می‌کند که فوراً به این سوالات پاسخ می‌دهد.

برای مثال، ممکن است وسوسه‌انگیز باشد که از ویژگی بسته‌بندی و بازکردن تاپل به جای روش سنتی جابجایی متغیرها استفاده کنید. پیمانهٔ timeit به سرعت یک برتری عملکرد جزئی را نشان می‌دهد:

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

در مقابلِ سطح دانه‌بندی ریز timeit، پیمانه‌های profile و pstats ابزارهایی برای شناسایی بخش‌های بحرانی زمانی در بلوک‌های بزرگ‌تر کد ارائه می‌دهند.

۱۰.۱۱. کنترل کیفیت

یک رویکرد برای توسعهٔ نرم‌افزار باکیفیت، نوشتن آزمون برای هر تابع هم‌زمان با توسعهٔ آن و اجرای مکرر این آزمون‌ها در طول فرآیند توسعه است.

پیمانهٔ doctest ابزاری برای پویش یک پیمانه و اعتبارسنجی آزمون‌های تعبیه‌شده در رشته‌های مستندات (Docstrings) برنامه فراهم می‌کند. ساخت آزمون به سادگی کپی و چسباندن یک فراخوانی معمول همراه با نتایج آن در رشتهٔ مستندات است. این کار با ارائهٔ مثال به کاربر، مستندات را بهبود می‌بخشد و به پیمانهٔ doctest اجازه می‌دهد تا اطمینان حاصل کند که کد با مستندات مطابقت دارد:

def average(values):
    """Computes the arithmetic mean of a list of numbers.

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

import doctest
doctest.testmod()   # automatically validate the embedded tests

پیمانهٔ 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)
        with self.assertRaises(ZeroDivisionError):
            average([])
        with self.assertRaises(TypeError):
            average(20, 30, 70)

unittest.main()  # Calling from the command line invokes all tests

۱۰.۱۲. باتری‌ها همراه هستند (Batteries Included)

پایتون دارای فلسفهٔ «باتری‌ها همراه هستند» است. این موضوع بهترین نمود خود را در قابلیت‌های پیشرفته و مستحکم بسته‌های بزرگ‌ترش نشان می‌دهد. برای مثال:

  • پیمانه‌های xmlrpc.client و xmlrpc.server پیاده‌سازی فراخوانی‌های رویهٔ از راه دور (Remote Procedure Calls) را به کاری تقریباً بدیهی تبدیل می‌کنند. علی‌رغم نام این پیمانه‌ها، نیازی به دانش مستقیم یا مدیریت XML نیست.
  • بستهٔ email کتابخانه‌ای برای مدیریت پیام‌های ایمیل، از جمله MIME و سایر اسناد پیام مبتنی بر RFC 5322 است. برخلاف smtplib و poplib که واقعاً پیام‌ها را ارسال و دریافت می‌کنند، بستهٔ email دارای مجموعه ابزاری کامل برای ساخت یا رمزگشایی ساختارهای پیچیدهٔ پیام (از جمله پیوست‌ها) و برای پیاده‌سازی پروتکل‌های کدگذاری اینترنت و هدرها است.
  • بستهٔ json پشتیبانی قدرتمندی برای تجزیهٔ این فرمت محبوب تبادل داده ارائه می‌دهد. پیمانهٔ csv از خواندن و نوشتن مستقیم فایل‌ها در فرمت مقادیر جداشده با کاما (CSV) که معمولاً توسط پایگاه‌های داده و صفحات گسترده پشتیبانی می‌شود، حمایت می‌کند. پردازش XML نیز توسط بسته‌های xml.etree.ElementTree، xml.dom و xml.sax پشتیبانی می‌شود. این پیمانه‌ها و بسته‌ها در کنار هم، تبادل داده بین برنامه‌های پایتون و سایر ابزارها را تا حد زیادی ساده می‌کنند.
  • پیمانهٔ sqlite3 یک پوشش (Wrapper) برای کتابخانهٔ پایگاه دادهٔ SQLite است که یک پایگاه دادهٔ ماندگار را فراهم می‌کند که می‌توان آن را با استفاده از نحو SQL کمی غیراستاندارد به‌روزرسانی و دسترسی داشت.
  • بین‌المللی‌سازی (Internationalization) توسط تعدادی پیمانه شامل gettext، locale و بستهٔ codecs پشتیبانی می‌شود.