Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
. TDP002 - Imperativ programmering Pythons standardbibliotek Eric Elfving Institutionen för datavetenskap (Med exempel från docs.python.org) 25 augusti 2015 ..... Översikt 2/28 • Felhantering • Pythons standardbibliotek - en översikt Creative Commons 4.0 ..... Felhantering 3/28 Python baseras på "Duck Typing". When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck. Creative Commons 4.0 ..... Felhantering 4/28 Detta leder till att vi kommer få fel som måste hanteras. >>> int('Anna') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: 'Anna' Här ser vi exempel på undantag (exceptions) • Direkt ett undantag kastas avbryts nuvarande körning och vi hoppar till närmsta hanterare • Finns ingen hanterare avbryts programmet (programmet "krashar") Creative Commons 4.0 ..... Felhantering 5/28 • En hanterare introduceras med ett try-block try: val=int(input('Mata in ett tal: ')) except: print('Skulle vara ett heltal!') Creative Commons 4.0 ..... Felhantering 6/28 • Vi kan hantera olika fel på olika sätt. try: 1/a except TypeError: print('a har fel typ!') except NameError: print('a finns inte!') except ZeroDivisionError: print('Kan inte dela med 0!') except: print('Annat fel') • Likt if-satsen är det den första som stämmer som vi går in i. Creative Commons 4.0 ..... Felhantering 7/28 • Vi kan hantera flera olika fel på samma sätt. try: 1/a except (TypeError, NameError): print('a är dålig!') except ZeroDivisionError: print('Kan inte dela med 0!') except: print('Annat fel') Creative Commons 4.0 ..... Felhantering 8/28 • Vi kan kasta undantag. >>> raise NameError('Hejsan') Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: Hejsan Creative Commons 4.0 ..... Felhantering 9/28 • Mer läsning: https://docs.python.org/3/tutorial/errors.html Creative Commons 4.0 ..... Slumphantering 10/28 • Ibland vill man få kod att uppföra sig slumpmässigt • Datorer har svårt att ge riktig slump men många språk har pseudo-slump (en algoritm beräknar ett "slumpat" värde) • Självklart finns det även i Python - modulen random http://docs.python.org/3/library/random.html Creative Commons 4.0 ..... Datumhantering 11/28 • Med hjälp av modulen datetime kan man på ett enkelt sätt hantera datum och tider i Python. • Det finns tre huvudtyper i modulen: date, time och datetime (finns även typer för tidsskillnader och tidszoner) http://docs.python.org/3/library/datetime.html Creative Commons 4.0 ..... Lagring av data 12/28 • Textfiler är bra för att lagra data mellan körningar • Det kan dock ställa till med problem • Hur ska jag formatera datat? • Vad händer om något är felformaterat? • Med hjälp av pickle kan man på ett enkelt sätt dumpa data till en fil för att sedan läsa in det igen • pickle.dump(obj, file) lagrar värdet i obj i den, för binär skrivning (wb), öppnade filen file • pickle.load(file) Laddar de värden som tidigare sparats i filen file och returnerar resultatet res = {'Kalle': 4, 'Anna': 5} file_name = 'resultat' with open(file_name, 'wb') as f: pickle.dump(res, f) http://docs.python.org/3/library/pickle.html Creative Commons 4.0 ..... Lagring av data 13/28 • pickle går inte alltid att lita på... • Använd endast data som du själv sparat ner eller från någon du litar på! Warning: The pickle module is not intended to be secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source. Creative Commons 4.0 ..... Lagring av data 14/28 CSV • Comma Separated Values • Används ofta för att exportera tabelldata i flera olika program • Har tyvärr ingen generell standard men kolumnvärden lagras ofta separerat med en specifik separator (ofta komma) import csv with open('fil.csv') as f: reader = csv.reader(f) for row in reader: print(row) Listing 1: fil.csv 1, 3, 6 12, 7, 6 [1, 3, 6] [12, 7, 6] http://docs.python.org/3/library/csv.html Creative Commons 4.0 ..... Lagring av data 15/28 json • JavaScript Object Notation • Ett transportformat baserat på javascript • Används väldigt mycket på www • Modulen json har ett gränssnitt som liknar pickle Creative Commons 4.0 ..... Lagring av data 16/28 json http://docs.python.org/3/library/json.html Creative Commons 4.0 ..... Konfigurationsfiler 17/28 • Med hjälp av konfigurationsfiler kan användare ändra på ditt programs funktionalitet utan att ändra i källkoden • Modulen configparser kan läsa filer på INI-formatet • Exempelfil: http://docs.python.org/3/library/configparser.html Creative Commons 4.0 ..... Konfigurationsfiler 18/28 http://docs.python.org/3/library/configparser.html Creative Commons 4.0 ..... Kommandoradsargument 19/28 • I de flesta programmeringsspråk kan man skicka värden till programmet när man startar det. Detta kallas kommandoradsargument. • Det "lättaste" sättet att få reda på kommandoradsargumenten är med hjälp av sys.argv. Det är en lista där varje element motsvarar ett argument. #! /usr/bin/env python3 # -*- coding: utf-8 -*import sys for arg in sys.argv: print(arg) $ chmod +x args.py $ python3 args.py args.py $ ./args.py Hej mitt lilla program! ./args.py Hej mitt lilla program! Creative Commons 4.0 ..... Kommandoradsargument 20/28 argparse • Man kan även använda sig av modulen argparse • Med argparse väljer man vilka flaggor och argument man väntar sig och sedan sköter modulen tolkningen - man slipper kontrollera och konvertera listelementen! http://docs.python.org/3/library/argparse.html Creative Commons 4.0 ..... Kommandoradsargument 21/28 argparse Creative Commons 4.0 ..... Lösenordshantering 22/28 • Ibland vill man be användare mata in lösenord • Vanligtvis använder vi input för indata men då kan ju andra se vad jag matar in • Modulen getpass är bra • Likt input kan man ge en ledtext (normalt sätt skrivs 'Password: ' ut) import getpass pwd = getpass.getpass() • Det finns även en funktion getuser som tar reda på vem man är inloggad som http://docs.python.org/3/library/getpass.html Creative Commons 4.0 ..... Operativsystemsanrop 23/28 subprocess • Ett anrop till ett systemkommando (eller ett annat program) kan göras med subprocess.call. Vi får ett returvärde som bör vara 0 om det gått bra. • Som parameter tar call en lista som liknar sys.argv >>> subprocess.call(["ls", "-l"]) 0 >>> subprocess.call(["cat", "fil_som_inte_finns"]) 1 • Vill vi komma åt utskrifter från program kan man använda sig av check_output >>> subprocess.check_output(["echo", "Hello World"]) b'Hello World\n' http://docs.python.org/3/library/subprocess.html Creative Commons 4.0 ..... Modulen os 24/28 • Modulen os har operativsystemsspecifika funktioner • Vissa av funktionerna fungerar endast för specifika operativsystem men de flesta fungerar lika oberoende av operativsystem • Några bra funktioner: os.environ En dict-liknande typ som innehåller Pythons miljövariabler os.listdir(path) Utför ls i mappen path, ger en lista som resultat os.mkdir Skapar mapp os.walk(path) Ger för varje mapp i path en tupel med mappens sökväg och listor med mappar respektive filer i denna mapp. walk går sedan nedåt i trädet rekursivt. http://docs.python.org/3/library/os.html Creative Commons 4.0 ..... os.path 25/28 • os.path är en undermodul med funktioner för att hantera filnamn på ett generellt sätt. Exempel: • os.path.join(p1,p2) som slår samman sökvägarna p1 och p2 med ett för nuvarande operativsystems bra sätt (med avsende på separator, '/' i Linux och '\' i windows) • os.path.isfile(f) kontrollerar om f är en fil • os.path.abspath(path) gör om path till en absolut sökväg http://docs.python.org/3/library/os.path.html Creative Commons 4.0 ..... Webåtkomst 26/28 urllib • Med urllib kan man komma åt information från webben • I modulen urllib.request finns en funktion urlopen som laddar en sida och ger ett fil-liknande värde som kan hanteras som en textfil import urllib.request with urllib.request.urlopen('http://www.ida.liu.se') as page: for line in page: if '<title>' in line: title = line.split('<title>') title = title[1].split('</') title = title[0] print(line) break ... <title>IDA > Home</title> ... IDA > Home http://docs.python.org/3/library/urllib.html Creative Commons 4.0 ..... Loggning 27/28 logging • Med logging kan man på ett enkelt sätt logga information om sin körning till fil import logging logging.basicConfig(filename='example.log', level=logging.INFO) logging.debug('This message does not go to the log file') logging.info('But this should') logging.warning('And this, too') INFO:root:But this should WARNING:root:And this, too • Finns också stöd för eget format (t.ex. tidsstämplar osv) http://docs.python.org/3/library/logging.html Creative Commons 4.0 . . www.liu.se