Previous Page

Up One Level

Next Page

Python Tutorial

Contents

Index

Volgende: 9. Classes Omhoog: Python Tutorial Volgende: 11. Hoe nu verder?
Onderdelen
  • 10.1 Interface met het besturingssysteem
  • 10.2 Wildcards in bestandsnamen
  • 10.3 Command-line argumenten
  • 10.4 Omleiding van foutuitvoer en programmabeëindiging
  • 10.5 Het matchen van stringpatronen
  • 10.6 Mathematica
  • 10.7 Toegang tot Internet
  • 10.8 Datum en tijd
  • 10.9 Datacompressie
  • 10.10 Performancemetingen
  • 10.11 Kwaliteitsbewaking
  • 10.12 Batterijen inbegrepen


10. Korte rondleiding door de Standard Library


10.1 Interface met het besturingssysteem

De module os biedt tientallen functies voor de interactie met het besturingssysteem:

>>> import os
>>> os.system('time 0:02')
0
>>> os.getcwd()      # Geef de huidige werkdirectory terug
'C:\\Python24'
>>> os.chdir('/server/accesslogs')

Gebruik de "import os" stijl in plaats van "from os import *". Op die manier krijgt os.open() niet de kans om de ingebouwde functie open() te verbergen, die heel anders werkt.

De ingebouwde functies dir() en help() zijn nuttig voor interactieve ondersteuning bij het werken met grote modules zoals 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>

Voor de dagelijkse bestands- en directorymanagementtaken biedt de module shutil een interface op een hoger niveau, die eenvoudiger is in het gebruik:

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


10.2 Wildcards in bestandsnamen

De module glob bevat een functie voor het maken van bestandslijsten op basis van wildcard-gebaseerde zoekacties in directories:

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


10.3 Command-line argumenten

Vaak moeten utility scripts meegegeven command-line argumenten afhandelen. Deze argumenten worden als list opgeslagen in het attribuut argv in de module sys. Zo is de volgende uitvoer het resultaat van het draaien van “python demo.py een twee drie” op de command line:

>>> import sys
>>> print sys.argv
['demo.py', 'een', 'twee', 'drie']

De module getopt verwerkt sys.argv op basis van de conventies van de Unix getopt()-functie. Een krachtigere en flexibelere vorm van command line verwerking wordt geleverd door de module optparse.


10.4 Omleiding van foutuitvoer en programmabeëindiging

De module sys heeft ook attributen voor stdin, stdout, en stderr. De laatste is nuttig voor het uitsturen van waarschuwingen en foutboodschappen, zodat deze zichtbaar gemaakt kunnen worden zelfs als stdout is omgelegd:

>>> sys.stderr.write('Waarschuwing, logbestand niet gevonden; nieuw bestand aangemaakt')
Waarschuwing, logbestand niet gevonden; nieuw bestand aangemaakt

De meest rechtstreekste manier om een script te beëindigen is het gebruik van "sys.exit()".


10.5 Het matchen van stringpatronen

In de module re vind je allerlei gereedschappen voor het gebruik van regular expressions, waarmee geavanceerde stringverwerkingen uitgevoerd kunnen worden. Voor complexe operaties op het gebied van het matchen en manipuleren van strings, kunnen regular expressions bondige en geoptimaliseerde oplossingen bieden:

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

Als je alleen simpele functionaliteit nodig hebt, kun je beter gebruik maken van de methods van het stringobject, omdat deze gemakkelijker te lezen en te debuggen zijn:

>>> 'thee voor tee'.replace('tee', 'twee')
'thee voor twee'


10.6 Mathematica

De module math geeft toegang tot de functies uit de onderliggende C-library voor floating point berekeningen:

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

De module random bevat tools voor het maken van random selecties:

>>> import random
>>> random.choice(['appel', 'peer', 'banaan'])
'appel'
>>> random.sample(xrange(100), 10)   # <sampling zonder vervanging>
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()    # random float
0.17970987693706186
>>> random.randrange(6)    # random integer gekozen uit range(6)
4


10.7 Toegang tot Internet

De standaardlibrary bevat een aantal modules voor de toegang tot internet en de verwerking van internetprotocollen. Tot de simpelste hiervan behoren urllib2 voor het ophalen van data vanaf url's, en smtplib voor het versturen van e-mail:

>>> import urllib2
>>> for line in urllib2.urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
... if 'EST' in line:      # zoek naar 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()


10.8 Datum en tijd

De module datetime stelt classes beschikbaar voor het manipuleren van datum en tijd, zowel op eenvoudige als op complexe manieren. Het rekenen met datums en tijdstippen wordt weliswaar ondersteund, maar de implementatie is met name gericht op het efficiënt extraheren van instance members ten behoeve van het opmaken van uitvoer, en het manipuleren van afzonderlijke members. De module ondersteunt ook objecten die rekening houden met tijdzones.

# data kunnen eenvoudig geconstrueerd en opgemaakt worden
>>> from datetime import date
>>> nu = date.today()
>>> nu
datetime.date(2003, 12, 2)
>>> nu.strftime("%d-%n-%y of %d%b %Y is een %A op de %ee dag van %B")
'02-12-03 of 02Dec 2003 is een Tuesday op de 02e dag van December'

# data ondersteunen rekenoperaties toegepast op de kalender
>>> geboortedatum = date(1964, 7, 31)
>>> leeftijd = nu - geboortedatum
>>> leeftijd.days
14368


10.9 Datacompressie

Rechtstreekse ondersteuning voor de reguliere data archiving en -compressieformaten in modules als zlib, gzip, bz2, zipfile, en 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


10.10 Performancemetingen

Sommige gebruikers van Python ontwikkelen een warme belangstelling voor het onderzoeken van de onderlinge performanceverschillen tussen verschillende benaderingen van hetzelfde probleem. Python beschikt over een meetinstrument dat onmiddellijk antwoord kan geven op dit soort vragen.

Het is bijvoorbeeld verleidelijk om de packing/unpacking optie van tuples te gebruiken, in plaats van de traditionele aanpak voor het swappen van argumenten. De module timeit toont echter al snel aan dat de traditionele aanpak sneller is:

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

Daar waar timeit een fijnmazige manier van performancebepaling biedt, verschaffen de modules profile en pstats instrumenten voor het identificeren van tijd-kritische onderdelen in grotere stukken code.


10.11 Kwaliteitsbewaking

Een mogelijke aanpak voor het ontwikkelen van software van hoge kwaliteit, is het schrijven van testen voor iedere functie terwijl (of voordat) deze ontwikkeld wordt, en vervolgens het regelmatig uitvoeren van deze testen gedurende het ontwikkelproces.

Met de module doctest hebben we een stuk gereedschap in handen voor het doorlopen van een module en het valideren van tests die zijn opgenomen in de docstrings in het programma. Het construeren van een test komt neer op het knippen en plakken van een doorsnee functie-aanroep, samen met het resultaat van de aanpak, in de docstring. Hierdoor wordt de documentatie verbeterd, doordat de gebruiker een voorbeeld van het gebruik van de functie tot zijn beschikking krijgt; daarnaast wordt de doctest-module in staat gesteld om te bepalen of de code nog steeds in lijn is met zijn documentatie:

def gemiddelde(waarden):
    """Berekent het rekenkundig gemiddelde van een lijst met nummers.

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

import doctest
doctest.testmod()   # automatische validatie van de ingebouwde testen

De module unittest vraagt wat meer inspanning van de gebruiker dan de module doctest, maar biedt wel ruimte voor een wat bredere verzameling tests, die bovendien in een apart bestand onderhouden kan worden:

import unittest

class TestStatistischeFuncties(unittest.TestCase):

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

unittest.main() # Voert alle tests uit, indien aangeroepen vanaf de command-line


10.12 Batterijen inbegrepen

Python hanteert de filosofie “batterijen inbegrepen”. Dit komt het duidelijkst naar voren in de geavanceerde en robuuste mogelijkheden van de grotere Python-packages. Bijvoorbeeld:

* De modules xmlrpclib en SimpleXMLRPCServer maken de implementatie van remote procedure calls bijna een fluitje van een cent. Anders dan de modulenamen doen vermoeden, heb je geen kennis van XML nodig, noch hoef je zelf met XML aan de slag om ze te kunnen gebruiken.

* Het package email is een library voor de verwerking en het beheer van emailberichten, inclusief MIME en andere op RFC 2822 gebaseerde berichtdocumenten. Anders dan smtplib en poplib, die de daadwerkelijke verzending en ontvangst van berichten verzorgen, beschikt het email-package over een complete toolset voor het construeren en/of decoderen van complexe berichtstructuren (inclusief attachments) en voor het implementeren van internet encoding en header-protocollen.

* De packages xml.dom en xml.sax leveren krachtige ondersteuning voor het parsen van dit populaire formaat voor gegevensuitwisseling. Analoog hieraan, ondersteunt de module csv het rechtstreeks lezen en schrijven in een gemeenschappelijk databaseformaat. Tezamen maken deze modules en packages het uitwisselen van gegeven tussen Pythonapplicaties en andere tools zeer eenvoudig.

* Internationalisatie (I18N) wordt met diverse modules ondersteund, waaronder gettext, locale, en het package codecs.


Previous Page

Up One Level

Next Page

Python Tutorial

Contents

Index

Volgende: 9. Classes Omhoog: Python Tutorial Volgende: 11. Hoe nu verder?
Release 2.3.4, documentation updated on May 20, 2004.
See About this document... for information on suggesting changes.