منابع ترجمه · The Python Tutorial · فصل ۱۰

گشتی کوتاه در کتابخانهٔ استاندارد (آموزش رسمی پایتون، فصل ۱۰)

۷ دقیقه مطالعه · به‌روزرسانی ۳ آبان ۱۴۰۵

منبع اصلی: The Python Tutorial, Chapter 10: Brief Tour of the Standard Library — Python Software Foundation

💡 این صفحه مثل یک نوت‌بوک Jupyter است: متغیر و تابعی که در یک سلول تعریف شود، در سلول‌های بعدی همین صفحه در دسترس است. سلول‌ها را به ترتیب اجرا کنید، یا با «⏮ تا اینجا» همهٔ سلول‌های قبلیِ اجرانشده را یک‌جا اجرا کنید.

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

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

>>> import os
>>> os.getcwd()      # Return the current working directory
'C:\\Python316'
>>> 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() تابع درون‌ساخت open() را که بسیار متفاوت کار می‌کند سایه‌دار (shadow) کند.

توابع درون‌ساخت 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 تابعی برای ساختن فهرست فایل‌ها از جست‌وجوهای wildcard پوشه فراهم می‌کند:

>>> 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 دارد. دومی (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 زیربنایی برای ریاضیات ممیز شناور را فراهم می‌کند:

>>> import math
>>> math.cos(math.pi / 4)
0.70710678118654757
>>> 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 کلاس‌هایی برای دستکاری تاریخ‌ها و زمان‌ها به روش‌های ساده و پیچیده فراهم می‌کند. هرچند محاسبات تاریخ و زمان پشتیبانی می‌شود، تمرکز پیاده‌سازی بر استخراج کارآمد اعضا برای قالب‌بندی خروجی و دستکاری است. ماژول همچنین اشیایی را که از منطقهٔ زمانی آگاهند پشتیبانی می‌کند.

>>> # 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 ابزاری برای پویش یک ماژول و اعتبارسنجی آزمون‌های تعبیه‌شده در docstringهای یک برنامه فراهم می‌کند. ساختن آزمون به سادگی بریدن و چسباندن یک فراخوانی معمول همراه با نتایجش در docstring است. این مستندات را با دادن یک مثال به کاربر بهبود می‌بخشد و به ماژول 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 call) را تقریباً به کاری پیش‌پاافتاده تبدیل می‌کنند. با وجود نام ماژول‌ها، هیچ دانش یا مدیریت مستقیمی از XML لازم نیست.

  • بستهٔ email کتابخانه‌ای برای مدیریت پیام‌های ایمیل است، شامل MIME و دیگر اسناد پیام مبتنی بر RFC 5322. بر خلاف smtplib و poplib که واقعاً پیام‌ها را ارسال و دریافت می‌کنند، بستهٔ email مجموعه ابزار کاملی برای ساختن یا رمزگشایی ساختارهای پیام پیچیده (از جمله پیوست‌ها) و برای پیاده‌سازی کدگذاری اینترنتی و پروتکل‌های سرایند دارد.

  • بستهٔ json پشتیبانی مقاومی برای تجزیهٔ این قالب محبوب تبادل داده فراهم می‌کند. ماژول csv خواندن و نوشتن مستقیم فایل‌ها را در قالب مقادیر جداشده با ویرگول (Comma-Separated Value) که معمولاً توسط پایگاه‌های داده و صفحه‌گسترده‌ها پشتیبانی می‌شود پشتیبانی می‌کند. پردازش XML توسط بسته‌های xml.etree.ElementTree، xml.dom و xml.sax پشتیبانی می‌شود. این ماژول‌ها و بسته‌ها با هم تبادل داده بین برنامه‌های پایتون و ابزارهای دیگر را بسیار ساده می‌کنند.

  • ماژول sqlite3 پوششی برای کتابخانهٔ پایگاه دادهٔ SQLite است و یک پایگاه دادهٔ پایدار فراهم می‌کند که می‌توان آن را با نحو SQL کمی غیراستاندارد به‌روزرسانی و دسترسی کرد.

  • بین‌المللی‌سازی توسط تعدادی ماژول از جمله gettext، locale و بستهٔ codecs پشتیبانی می‌شود.