Best practices, coding style and general tips
===============================================
This is a collection of guidelines regarding best practices,
coding style and usage patterns for the openEO Python Client Library.
It is in the first place an internal recommendation for openEO *developers*
to give documentation, code examples, demo's and tutorials
a *consistent* look and feel,
following common software engineering best practices.
Secondly, the wider audience of openEO *users* is also invited to pick up
a couple of tips and principles to improve their own code and scripts.
Background and inspiration
---------------------------
While some people consider coding style a personal choice or even irrelevant,
there are various reasons to settle on certain conventions.
Just the fact alone of following conventions
lowers the bar to get faster to the important details in someone else's code.
Apart from taste, there are also technical reasons to pick certain rules
to *streamline the programming workflow*,
not only for humans,
but also supporting tools (e.g. minimize risk on merge conflicts).
While the Python language already has a strong focus on readability by design,
the Python community is strongly gravitating to even more strict conventions:
- `pep8 `_: the mother of all Python code style guides
- `black `_: an opinionated code formatting tool
that gets more and more traction in popular, high profile projects.
This openEO oriented style guide will highlight
and build on these recommendations.
General code style recommendations
------------------------------------
- Indentation with 4 spaces.
- Avoid star imports (``from module import *``).
While this seems like a quick way to import a bunch of functions/classes,
it makes it very hard for the reader to figure out where things come from.
It can also lead to strange bugs and behavior because it silently overwrites
references you previously imported.
Line (length) management
--------------------------
While desktop monitors offer plenty of (horizontal) space nowadays,
it is still a common recommendation to *avoid long source code lines*.
Not only are long lines hard to read and understand,
one should also consider that source code might still be viewed
on a small screen or tight viewport,
where scrolling horizontally is annoying or even impossible.
Unnecessarily long lines are also notorious
for not playing well with version control tools and workflows.
Here are some guidelines on how to split long statements over multiple lines.
Split long function/method calls directly after the opening parenthesis
and list arguments with a standard 4 space indentation
(not after the first argument with some ad-hoc indentation).
Put the closing parenthesis on its own line.
.. code-block:: python
# Avoid this:
s2_fapar = connection.load_collection("TERRASCOPE_S2_FAPAR_V2",
spatial_extent={'west': 16.138916, 'east': 16.524124, 'south': 48.1386, 'north': 48.320647},
temporal_extent=["2020-05-01", "2020-05-20"])
# This is better:
s2_fapar = connection.load_collection(
"TERRASCOPE_S2_FAPAR_V2",
spatial_extent={'west': 16.138916, 'east': 16.524124, 'south': 48.1386, 'north': 48.320647},
temporal_extent=["2020-05-01", "2020-05-20"],
)
.. TODO how to handle chained method calls
Jupyter(lab) tips and tricks
-------------------------------
- Add a cell with ``openeo.client_version()`` (e.g. just after importing all your libraries)
to keep track of which version of the openeo Python client library you used in your notebook.
.. TODO how to work with "helper" modules?