Moduly¶
Síla programovacího jazyka není pouze v jeho syntaxi, ale především ve funkcích, které už někdo naprogramoval před vámi a vy je musíte jenom použít.
Python používá systém modulů - v podstatě se jedná o soubory, ve kterých jsou funkce uloženy a do vašeho programu je musíte naimportovat. Heslem Pythonu je „batterries included“ a znamená to, že opravdu spousta věcí je už hotová a dostupná.
Čím více modulů budete importovat, tím více vám váš program bude zabírat v paměti a jeho spouštění bude o něco pomalejší - neimportujte něco, co nepotřebujete.
Vyzkoušíme si např. některé funkce z modulu math
import math
print(math.sqrt(10))
Funkce sqrt()
není standardně v základu Pythonu přítomna. Program by skončil
výjimkou
NameError: name 'math' is not defined
Modul math obsahuje celou řadu zajímavých věcí, např. číslo PI
print(math.pi)
print(math.e)
Importovat můžete buď celé moduly, jako v předchozím příkladě, nebo jenom
jednotlivé fukce, např. sin()
.
from math import sin
print(sin(math.pi/2))
Nyní něco ze světa prostorových dat
from shapely.geometry import Point
centroid = Point(0.0, 0.0) # vytvoříme nový objekt třídy "Point"
patch = centroid.buffer(10.0) # zavoláme jeho metodu buffer
print(patch.area) # a tiskneme jeho plochu
V předchozím příkladu jsme z modulu shapely, který nám umožňuje pracovat s
vektorovými geometriemi naimportovali třídu Point
, vytvořili jsme nový
bod, okolo něj buffer o velikosti 10 a vytiskli plochu výsledné obalové zóny.
Trochu jsme tím nakoukli do světa objektově-orientovaného programování, blíže se s ním seznámíme v další části.
Nyní zkusíme ještě vytisknout vytvořený buffer ve formátu GeoJSON:
import json
from shapely.geometry import mapping
print(json.dumps(mapping(patch)))
V předchozím příkladu jsme na posledním řádku použili jako vstup pro funkci
print()
výstup z funkce json.dumps()
, která zase dostala výstup z
funkce mapping()
- není to moc přehledné, ale podobné konstrukce se
používají často.
Dokumentace k modulům¶
Je na čase, seznámit se s příkazem pydoc (nebo pydoc3), který jako parametr dostane modul a provede vás jeho dokumentací
$ pydoc shapely
Help on package shapely.geometry in shapely:
NAME
shapely.geometry - Geometry classes and factories
FILE
/home/jachym/.local/lib/python2.7/site-packages/shapely/geometry/__init__.py
PACKAGE CONTENTS
base
collection
geo
linestring
multilinestring
multipoint
multipolygon
...
Google vám vždycky dobře poradí, pokud správně hledáte a seznam modulů distribuovaných spolu s jazykem Python najdete na dokumentační stránce jazyka Python
Vlastní moduly¶
Uložíte-li program do souboru, stává se tímto váš soubor modulem, který lze použít a naimportovat.
Vytvoříme soubor buffer.py
s následujícím obsahem:
from shapely.geometry import Point
from shapely.geometry import mapping, shape
def udelej_buffer(geometry, velikost):
"""Vrátí buffer ve formátu GeoJSON pro zadanou geometrii
"""
geometrie = shape(geometry)
buffer = geometrie.buffer(velikost)
return mapping(buffer)
Nyní můžeme v jiném programu (nebo přímo v interpretu) náš modul použít:
>>> import buffer
>>> muj_bod = {"type": "Point", "coordinates": [0.0, 0.0]}
>>> buffer.udelej_buffer(muj_bod, 3)
{
'type': 'Polygon',
'coordinates': ((
(3.0, 0.0),
(2.9855541800165906, -0.29405142098868153),
(2.9423558412096917, -0.5852709660483842),
(2.8708210071966267, -0.8708540317633864),
(2.771638597533861, -1.1480502970952682),
(2.6457637930450657, -1.4141902104779915),
(2.4944088369076365, -1.6667106990588052),
(2.3190313600882124, -1.903179852490935),
(2.1213203435596446, -2.1213203435596406),
(1.903179852490939, -2.319031360088209),
(1.6667106990588092, -2.4944088369),
...
))
}
Moduly nám tedy umožňují uklidit spolu související části programu do logických celků, rozsekat rozsáhlé programy do menších souborů a strukturovat tak kód pro přehlednější použití.