Vytváříme Python projekt
Ukážeme si, jak vytvořit kompletní projekt v Pythonu. Navrhneme vhodnou adresářovou strukturu. Ukážeme si některé nástroje, které je možné použít, včetně verzovacího systému Git. A řekneme si něco málo o distribuci ve světě Pythonu.
Vhodná adresářová struktura¶
Python nevyžaduje žádnou speciální strukturu adresářů, existují pouze zvyklosti. Přehled takových zvyklostí najdeme např. v https://realpython.com/python-application-layouts/.
Úplně jednoduchý projekt (script):
helloworld/
│
├── .gitignore
├── helloworld.py
├── LICENSE
├── README.md
├── requirements.txt
├── setup.py
└── tests.py
Typický projekt - instalovatelná knihovna:
helloworld/
│
├── helloworld/
│ ├── __init__.py
│ ├── helloworld.py
│ └── helpers.py
│
├── tests/
│ ├── helloworld_tests.py
│ └── helpers_tests.py
│
├── .gitignore
├── LICENSE
├── README.md
├── requirements.txt
└── setup.py
V první řadě vytvoříme adresář, kam dáváme všechny soubory týkající se projektu.
PEP 8¶
O PEP 8 jsme se již zmínili. Tento dokument ovšem obsahuje natolik důležité konvence, že je dobré ho znovu připomenout. Jeho znalost a dodržování výrazně zlepšuje čitelnost kódů od ostatních / ostatními programátory. Vhodné je, aby přímo editor kontroloval PEP 8, případně alespoň použít samostatný pep8 příkaz.
Několik důležitých bodů:
- Use 4 spaces per indentation level. Spaces are the preferred indentation method.
- Limit all lines to a maximum of 79 characters. The preferred way of wrapping long lines is by using Python's implied line continuation inside parentheses, brackets and braces.
- Avoid extraneous whitespace in the following situations:
- Immediately inside parentheses, brackets or braces.
- Immediately before a comma, semicolon, or colon:
- Immediately before the open parenthesis that starts the argument list of a function call:
- Immediately before the open parenthesis that starts an indexing or slicing:
- More than one space around an assignment (or other) operator to align it with another.
- Modules should have short, all-lowercase names.
- Almost without exception, class names use the CapWords convention.
- Function names should be lowercase, with words separated by underscores as necessary to improve readability.
Cvičný projekt: načítání csv souboru¶
Na ukázku si zkusíme načíst csv soubor. To není příliš složité, navíc si specifikaci ještě trochu zjednodušíme. Co budeme od projektu chtít:
- Načíst csv (specifikace např. na wikipedii (pro jednoduchost nebudeme uvažovat uvozovky) soubor do seznamu řádků.
- Zvolit si oddělovač řádků
- Každý řádek bude reprezentován seznamem.
- Každá položka bude převedena na int, float nebo str podle obsahu.
- Napíšeme unit testy pro nose.
- Vytvoříme dokumentaci pomocí Sphinx.
Co se může hodit¶
- Práce se soubory (open + iterace)
- str metody split, strip
- Převod na float a int
- Generátorova notace
Verzovací systém Git¶
Vhodné je používat nějaký nástroj na správu verzí. V současnosti je nejrozšířenější Git. Základní kroky jsou:
- Vytvořit adresář projektu.
- Inicializovat pomocí
git init
. - Přidat nebo změnit soubory.
- Změněné / nové soubory přidat pomocí
git add <jména souborů>
. - Vytvořit revizi pomocí
git commit
. - ... zpět na 3.
Testování pomocí pytest
¶
pytest
umožňuje jednoduše spravovat a spouštět unit testy.
- V adresáři
tests
vytvoříme soubor(y)s testy, např.tests_main.py
. - V tomto souboru implementujeme funkce, které začínají
test_
(např.test_int
). Typicky v těchto funkcích používáme pro testováníassert
. - Testy spustíme pomocí
python -m pytest
.
Dokumentace pomocí Sphinx¶
Sphinx je nástroj pro vytváření přehledné a vizuálně atraktivní dokumentace. Sphinx převádí reStructuredText na HTML, LaTeX aj. Navíc dokáže z dokumentace (docstrings) ve zdrojového kódu vytvořit přehlednou dokumentaci v reStructuredText. Výsledkem je např. vlastní dokumentace Pythonu a mnoho dalších.
Základní postup¶
- V adresáři doc spustíme
sphinx-quickstart
. Odpovíme na otázky, z rozšíření budeme potřebovatautodoc
, případněviewcode
. - Podíváme se, co Sphinx vytvořil. Především to jsou soubory
conf.py
aindex.rst
. - V
conf.py
téměř na začátku odkomentujemesys.path.insert
řádek a přidáme adresář'..'
. - Vytvoříme API dokumentaci pomocí
sphinx-apidoc -f -o . ../project
(project nahradíme vlastním názvem). - Vytvoříme html pomocí
make html
.
Jak software publikovat¶
Publikace softwaru je spíše pokročilejší téma a nebudeme se mu příliš věnovat. Základní postup je popsán např. na https://packaging.python.org/tutorials/packaging-projects/.
Základem je vytvořit soubor setup.py
(pro setuptools, který může vypadat zhruba takto:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="example-pkg-YOUR-USERNAME-HERE", # Replace with your own username
version="0.0.1",
author="Example Author",
author_email="author@example.com",
description="A small example package",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/pypa/sampleproject",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
)
Pokud to s produkcí a distribucí Python knihoven a aplikací myslíte vážně, podívejte se na https://poetry.eustace.io/.
Komentáře
Comments powered by Disqus