10. Standart Kütüphanenin Özeti

10.1. İşletim Sistemi Arayüzü

os modülü, işletim sistemiyle etkileşim kurmak için düzinelerce fonksiyon sağlar:

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

from os import * yerine import os stilini kullandığınızdan emin olun. Yanlış kullanım olan ilk stili tercih etmek, os.open() ‘ın çok daha farklı çalışan gömülü open() fonksiyonunu gölgelemesine neden olur.

Gömülü dir() ve help() fonksiyonları os gibi büyük modüllerle çalışma konusunda interaktif yardımcılar olarak kullanışlıdır:

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

Günlük dosya ve dizin yönetimi görevleri için shutil modülü kullanımı daha kolay olan daha yüksek düzeyli (higher level) bir arayüz sağlar:

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

10.2. Dosya Joker Karakterleri

glob modülü , klasör joker karakter aramalarından dosya listeleri oluşturabilmek için bir fonsiyon sağlar:

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

10.3. Komut Satırı Argümanları

Common utility scripts often need to process command line arguments. These arguments are stored in the sys module’s argv attribute as a list. For instance, let’s take the following demo.py file:

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

Here is the output from running python demo.py one two three at the command line:

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

argparse modülü, komut satırı argümanlarını işlemek için daha sofistike bir yöntem sağlar. Aşağıdaki program, bir veya birden fazla dosya adını ve isteğe bağlı görüntülenecek satır sayısını ayıklar:

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)

Komut satırında python top.py --lines=5 alpha.txt beta.txt çalıştırıldığı zaman program, args.lines ögesini 5 ve args.filenames ögesini ['alpha.txt', 'beta.txt'] olarak ayarlar.

10.4. Hata Çıktısının Yeniden Yönlendirilmesi ve Programın Sonlandırılması

sys modülü ayrıca stdin, stdout ve stderr özelliklerine sahiptir. İkincisi, stdout yeniden yönlendirilmiş olsa bile bunları görünür hale getirmek için uyarılar ve hata iletileri yayımlamak için yararlıdır:

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

Bir programı sonlandırmak için, en kısa yol olan sys.exit() komutunu kullanın.

10.5. String Örüntü Eşlemesi

re modülü, gelişmiş string işleme için kurallı ifade araçları sağlar. Karmaşık eşleme ve manipülasyon için, kurallı ifadeler kısa ve optimize edilmiş çözümler sunar:

>>> 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'

Basit işlemlerde “string” metodu önerilir çünkü okuması ve hata ayıklaması daha kolaydır:

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

10.6. Matematik

math modülünün içindeki C kütüphanesi ondalıklı matematik fonksiyonlarına erişim sağlar:

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

random modülü rastgele seçimler yapmak için araçlar sağlar:

>>> 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
0.17970987693706186
>>> random.randrange(6)    # random integer chosen from range(6)
4

statistics modülü sayı içeren veriler için temel istatistiksel özellikleri hesaplar (ortalama, ortanca, fark, vb.):

>>> 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 projesi <https://scipy.org> sayısal hesaplamalar için daha fazla modül içerir.

10.7. İnternet Erişimi

İnternete bağlanmak ve internet protokollerini işlemek için bazı modüller var. Bunlardan en basit ikisi; urllib.request URL’lerden veri çekmek, ve smtplib ise mail göndermek için:

>>> from urllib.request import urlopen
>>> with urlopen('http://worldtimeapi.org/api/timezone/etc/UTC.txt') as response:
...     for line in response:
...         line = line.decode()             # Convert bytes to a str
...         if line.startswith('datetime'):
...             print(line.rstrip())         # Remove trailing newline
...
datetime: 2022-01-01T01:36:47.689215+00:00

>>> 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()

(İkinci örnek için bir mail sunucusunun localhost’ta çalışması gerektiğini unutmayın.)

10.8. Tarihler ve Saatler

datetime modülü, tarihleri ve saatleri hem basit hem de karmaşık şekillerde işlemek için sınıflar sağlar. Tarih ve saat aritmetiği desteklenirken, uygulamanın odak noktası çıktı biçimlendirmesi ve düzenlemesi için verimli üye ayıklamadır. Modül ayrıca saat dilimi farkında olan nesneleri de destekler.

>>> # dates are easily constructed and formatted
>>> from datetime import date
>>> now = 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 = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368

10.9. Veri Sıkıştırma

Genel veri arşivleme ve sıkıştırma formatları şu modüller tarafından desteklenir: zlib, gzip, bz2, lzma, zipfile ve 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

10.10. Performans Ölçümü

Bazı Python kullanıcıları, aynı soruna farklı yaklaşımların göreli performansını bilmek konusunda derin bir ilgi geliştirir. Python, bu soruları hemen yanıtlayan bir ölçüm aracı sağlar.

Örneğin, argümanları değiştirmek için geleneksel yaklaşım yerine dizi paketleme ve açma özelliğini kullanmak cazip olabilir. timeit modülü hızla sade bir performans avantajı gösterir:

>>> 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 ‘in ince ayrıntı düzeyinin aksine, profile ve pstats modülleri, daha büyük kod bloklarında zaman açısından kritik bölümleri tanımlamak için araçlar sağlar.

10.11. Kalite Kontrolü

Yüksek kalitede yazılımlar geliştirmek için her fonksiyon için testler yazılmalıdır ve bu testler geliştirirken sık sık çalıştırmalıdır.

doctest modülü, bir modülü taramak ve bir programın docstrings’ine gömülü testleri doğrulamak için bir araç sağlar. Test yapısı, sonuçlarıyla birlikte tipik bir çağrıyı docstring’e kesip yapıştırma kadar basittir. Bu, kullanıcıya bir örnek sunarak dokümantasyonu geliştirir ve doctest modülünün kodun dokümantasyona göre doğru olduğundan emin olmasını sağlar:

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 modülü, doctest modülü gibi çaba istemeyen bir modül değildir ama daha geniş kapsamlı test setlerinin ayrı dosyalarda sağlanmasına imkân verir:

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

10.12. Bataryalar Dahildir

Python’un “bataryalar dahil” felsefesi vardır. Bu , büyük paketlerin en iyi şekilde sofistike ve sağlam kapabiliteleriyle görülür. Mesela:

  • xmlrpc.client ve xmlrpc.server modülleri, uzak işlem grubu çağrılarını uygulamayı neredeyse önemsiz bir görev haline getirir. Modül adlarına rağmen, XML’nin doğrudan bilgisine veya işlenmesine gerek yoktur.

  • email paketi e-mail mesajlarını işlemek için bir kütüphanedir.MIME ve diğer RFC 2822-tabanlı mesajların dokümanlarını içerir. Mesaj gönderip alan smtplib ve poplib ‘in aksine, e-mail paketinin derleme işlemini, kompleks mesaj yapılarının (ekler dahil) decode edilebilmesini sağlayan, internet encode işlemini ve header protokollerini uygulamak için geniş kapsamlı bir toolkit’e sahiptir.

  • json paketi, bu popüler veri değişim biçimini ayrıştırmak için sağlam destek sağlar. csv modülü, genellikle veritabanları ve elektronik tablolar tarafından desteklenen Virgülle-Ayrılmış Değer biçimindeki dosyaların doğrudan okunmasını ve yazılmasını destekler. XML işleme xml.etree.ElementTree, xml.dom ve xml.sax paketleri tarafından desteklenir. Birlikte, bu modüller ve paketler Python uygulamaları ve diğer araçlar arasındaki veri değişimini büyük ölçüde basitleştirir.

  • sqlite3 modülü , SQLite veritabanı kütüphanesi için bir wrapper’dır. Biraz standart dışı SQL syntax’ları kullanılarak güncellenebilen ve erişilebilen kalıcı bir veritabanı sağlanabilir.

  • Uluslararasılaştırma gettext, locale ve codecs paketi dahil olmak üzere bir dizi modül tarafından desteklenir.