Dependency management
Python doesn't seem to have build tools like Maven, Gradle, SBT etc. Instead, you use virtual environments that are tailored to your project.
To set it up, you run something like:
python3 -m venv ~/env/ARBITRARY_NAME_FOR_ENV
source ~/env/ARBITRARY_NAME_FOR_ENV/bin/activate
pip install -r requirements.txt
where requirements.txt looks something like:
apache-airflow[gcp_api]==1.10.1
google-api-python-client==1.7.8
pytest
IDEs
PyCharm seems the IDE of choice in my office. The community edition can be downloaded and used for free.
When setting up a project, one must Add a new Python interpreter and this allows you to choose the virtual environment you want for this project.
Logging
For logging, just use a:
import logging
See the Python Docs for examples.
Mocking
You can use mocks in at least 2 different ways:
@patch('x.y.method_to_mock', return_value=VALUE_MOCK_RETURNS)
or
def test_trigger_dataflow_success(mocked_service, config, task_instance, monkeypatch, data_access_layer_stub):
.
.
def mock_my_method(an_argument):
return my_stub
.
.
monkeypatch.setattr('x.y.method_to_mock', mock_my_method)
Tests
Tests are run with the command:
python -m pytest tests/
What is included appears to be based on convention.
"py.test will import conftest.py and all Python files that match the python_filespattern, by default test_*.py. If you have a test fixture, you need to include or import it from conftest.py or from the test files that depend on it" [from SO].
It appears (?) that test files that are nested deeper will use the conftest.py of higher packages in the same branch.
Notable differences with Java
Unlike Java, Python classes tend not to live in files that bear their names [SO]. So, if you have a class called X in file y.py in package z, you'd import it with:
from z import y
x = y.X(...)
Note the absence of the new operator.
No comments:
Post a Comment