Skip to content

Commit ff8aebf

Browse files
committed
Attempt to add Python 3.11 support
Python 3.11 has been released as scheduled on October 25, 2022 and this is the first attempt to see how far Airflow (mostly dependencies) are from being ready to officially support 3.11. So far we had to exclude the following dependencies: - [ ] Pyarrow dependency: apache/arrow#14499 - [ ] Google Provider: apache#27292 and googleapis/python-bigquery#1386 - [ ] Databricks Provider: databricks/databricks-sql-python#59 - [ ] Papermill Provider: nteract/papermill#700 - [ ] Azure Provider: Azure/azure-uamqp-python#334 and Azure/azure-sdk-for-python#27066 - [ ] Apache Beam Provider: apache/beam#23848 - [ ] Snowflake Provider: snowflakedb/snowflake-connector-python#1294 - [ ] JDBC Provider: jpype-project/jpype#1087 - [ ] Hive Provider: cloudera/python-sasl#30 We might decide to release Airflow in 3.11 with those providers disabled in case they are lagging behind eventually, but for the moment we want to work with all the projects in concert to be able to release all providers (Google Provider requires quite a lot of work and likely Google Team stepping up and community helping with migration to latest Goofle cloud libraries)
1 parent 7f2b065 commit ff8aebf

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+922
-694
lines changed

CI.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ Container Registry used as cache
5959
We are using GitHub Container Registry to store the results of the ``Build Images``
6060
workflow which is used in the ``Tests`` workflow.
6161

62-
Currently in main version of Airflow we run tests in 4 different versions of Python (3.7, 3.8, 3.9, 3.10)
62+
Currently in main version of Airflow we run tests in those versions of Python (3.7, 3.8, 3.9, 3.10, 3.11)
6363
which means that we have to build 8 images (4 CI ones and 4 PROD ones). Yet we run around 12 jobs
6464
with each of the CI images. That is a lot of time to just build the environment to run. Therefore
6565
we are utilising ``pull_request_target`` feature of GitHub Actions.

LOCAL_VIRTUALENV.rst

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ Required Software Packages
5151
Use system-level package managers like yum, apt-get for Linux, or
5252
Homebrew for macOS to install required software packages:
5353

54-
* Python (One of: 3.7, 3.8, 3.9, 3.10)
54+
* Python (One of: 3.7, 3.8, 3.9, 3.10, 3.11)
5555
* MySQL 5.7+
5656
* libxml
5757

@@ -102,7 +102,7 @@ Creating a Local virtualenv
102102

103103
To use your IDE for Airflow development and testing, you need to configure a virtual
104104
environment. Ideally you should set up virtualenv for all Python versions that Airflow
105-
supports (3.7, 3.8, 3.9, 3.10).
105+
supports (3.7, 3.8, 3.9, 3.10, 3.11).
106106

107107
To create and initialize the local virtualenv:
108108

@@ -122,7 +122,7 @@ To create and initialize the local virtualenv:
122122

123123
.. code-block:: bash
124124
125-
conda create -n airflow python=3.7 # or 3.8, 3.9, 3.10
125+
conda create -n airflow python=3.7 # or 3.8, 3.9, 3.10, 3.11
126126
conda activate airflow
127127
128128
2. Install Python PIP requirements:
@@ -150,7 +150,7 @@ for different python versions). For development on current main source:
150150

151151
.. code-block:: bash
152152
153-
# use the same version of python as you are working with, 3.7, 3.8, 3.9, or 3.10
153+
# use the same version of python as you are working with, 3.7, 3.8, 3.9, 3.10 or 3.11
154154
pip install -e ".[devel,<OTHER EXTRAS>]" \
155155
--constraint "https://raw.githubusercontent.com/apache/airflow/constraints-main/constraints-source-providers-3.7.txt"
156156
@@ -163,7 +163,7 @@ You can also install Airflow in non-editable mode:
163163

164164
.. code-block:: bash
165165
166-
# use the same version of python as you are working with, 3.7, 3.8, 3.9, or 3.10
166+
# use the same version of python as you are working with, 3.7, 3.8, 3.9, 3.10 or 3.11
167167
pip install ".[devel,<OTHER EXTRAS>]" \
168168
--constraint "https://raw.githubusercontent.com/apache/airflow/constraints-main/constraints-source-providers-3.7.txt"
169169
@@ -173,7 +173,7 @@ sources, unless you set ``INSTALL_PROVIDERS_FROM_SOURCES`` environment variable
173173

174174
.. code-block:: bash
175175
176-
# use the same version of python as you are working with, 3.7, 3.8, 3.9, or 3.10
176+
# use the same version of python as you are working with, 3.7, 3.8, 3.9, 3.10 or 3.11
177177
INSTALL_PROVIDERS_FROM_SOURCES="true" pip install ".[devel,<OTHER EXTRAS>]" \
178178
--constraint "https://raw.githubusercontent.com/apache/airflow/constraints-main/constraints-source-providers-3.7.txt"
179179

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ Apache Airflow is tested with:
8888

8989
| | Main version (dev) | Stable version (2.5.0) |
9090
|---------------------|------------------------------|------------------------------|
91-
| Python | 3.7, 3.8, 3.9, 3.10 | 3.7, 3.8, 3.9, 3.10 |
91+
| Python | 3.7, 3.8, 3.9, 3.10, 3.11 | 3.7, 3.8, 3.9, 3.10, 3.11 |
9292
| Platform | AMD64/ARM64(\*) | AMD64/ARM64(\*) |
9393
| Kubernetes | 1.23, 1.24, 1.25, 1.26 | 1.21, 1.22, 1.23, 1.24, 1.25 |
9494
| PostgreSQL | 11, 12, 13, 14, 15 | 11, 12, 13, 14, 15 |

airflow/providers/apache/beam/provider.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ dependencies:
4040
- apache-airflow>=2.3.0
4141
- apache-beam>=2.33.0
4242

43+
# Excluded because apache-beam and a number of dependent libraries are not
44+
# compatible with 3.11 yet. See https://github.com/apache/beam/issues/23848
45+
excluded-python-versions:
46+
- "3.11"
47+
4348
integrations:
4449
- integration-name: Apache Beam
4550
external-doc-url: https://beam.apache.org/

airflow/providers/apache/hive/provider.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ dependencies:
5858
- sasl>=0.3.1; python_version>="3.9"
5959
- thrift>=0.9.2
6060

61+
# Excluded because SASL is not yet compatible
62+
# with 3.11. See https://github.com/cloudera/python-sasl/issues/30
63+
excluded-python-versions:
64+
- "3.11"
65+
6166
integrations:
6267
- integration-name: Apache Hive
6368
external-doc-url: https://hive.apache.org/

airflow/providers/databricks/provider.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ dependencies:
4848
- databricks-sql-connector>=2.0.0, <3.0.0
4949
- aiohttp>=3.6.3, <4
5050

51+
# Excluded because databricks-sql-connector and a number of dependent libraries are not compatible
52+
# with 3.11 yet See https://pyreadiness.org/3.11/. (Pyarrow is one of the important ones)
53+
# See https://github.com/databricks/databricks-sql-python/issues/59 for issue that tracks it
54+
excluded-python-versions:
55+
- "3.11"
56+
5157
integrations:
5258
- integration-name: Databricks
5359
external-doc-url: https://databricks.com/

airflow/providers/google/provider.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ dependencies:
123123
# Google bigtable client require protobuf <= 3.20.0. We can remove the limitation
124124
# when this limitation is removed
125125
- protobuf<=3.20.0
126+
# Excluded because bigquery and a number of dependent libraries are not compatible with 3.11 yet
127+
# See https://pyreadiness.org/3.11/. Also some of Google libraries are in pretty ancient
128+
# version (pre 2.0.0) and they MUST be migrated in order to add 3.11 support
129+
# This is tracked in https://github.com/apache/airflow/issues/27292
130+
excluded-python-versions:
131+
- "3.11"
126132

127133
integrations:
128134
- integration-name: Google Analytics360

airflow/providers/papermill/provider.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@ dependencies:
4040
- papermill[all]>=1.2.1
4141
- scrapbook[all]
4242

43+
# Excluded because papermill and a number of dependent libraries are not compatible
44+
# with 3.11 yet See https://pyreadiness.org/3.11/. (Pyarrow is one of the important ones)
45+
# See for issue that tracks it https://github.com/nteract/papermill/issues/700
46+
excluded-python-versions:
47+
- "3.11"
48+
49+
4350
integrations:
4451
- integration-name: Papermill
4552
external-doc-url: https://github.com/nteract/papermill

airflow/providers/snowflake/provider.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ dependencies:
5353
- snowflake-connector-python>=2.4.1
5454
- snowflake-sqlalchemy>=1.1.0
5555

56+
# Excluded because snowflake connector python and a number of dependent libraries are not
57+
# compatible with 3.11 yet. See https://pyreadiness.org/3.11/. One of the important dependencies
58+
# is Pyarrow: https://github.com/apache/arrow/pull/14499 but the
59+
# https://github.com/snowflakedb/snowflake-connector-python/issues/1289 is the issue
60+
excluded-python-versions:
61+
- "3.11"
62+
5663
integrations:
5764
- integration-name: Snowflake
5865
external-doc-url: https://snowflake.com/

dev/README_RELEASE_AIRFLOW.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1036,7 +1036,7 @@ the older branches, you should set the "skip" field to true.
10361036
## Verify production images
10371037
10381038
```shell script
1039-
for PYTHON in 3.7 3.8 3.9 3.10
1039+
for PYTHON in 3.7 3.8 3.9 3.10 3.11
10401040
do
10411041
docker pull apache/airflow:${VERSION}-python${PYTHON}
10421042
breeze prod-image verify --image-name apache/airflow:${VERSION}-python${PYTHON}

dev/breeze/SELECTIVE_CHECKS.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ The selective check outputs available are described below:
108108

109109
| Output | Meaning of the output | Example value |
110110
|------------------------------------|--------------------------------------------------------------------------------------------------------|---------------------------------------------------------------|
111-
| all-python-versions | List of all python versions there are available in the form of JSON array | ['3.7', '3.8', '3.9', '3.10'] |
112-
| all-python-versions-list-as-string | List of all python versions there are available in the form of space separated string | 3.7 3.8 3.9 3.10 |
111+
| all-python-versions | List of all python versions there are available in the form of JSON array | ['3.7', '3.8', '3.9', '3.10', '3.11'] |
112+
| all-python-versions-list-as-string | List of all python versions there are available in the form of space separated string | 3.7 3.8 3.9 3.10 3.11 |
113113
| basic-checks-only | Whether to run all static checks ("false") or only basic set of static checks ("true") | false |
114114
| cache-directive | Which cache should be be used for images ("registry", "local" , "disabled") | registry |
115115
| debug-resources | Whether resources usage should be printed during parallel job execution ("true"/ "false") | false |

dev/breeze/src/airflow_breeze/global_constants.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
APACHE_AIRFLOW_GITHUB_REPOSITORY = "apache/airflow"
3737

3838
# Checked before putting in build cache
39-
ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS = ["3.7", "3.8", "3.9", "3.10"]
39+
ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11"]
4040
DEFAULT_PYTHON_MAJOR_MINOR_VERSION = ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS[0]
4141
ALLOWED_ARCHITECTURES = [Architecture.X86_64, Architecture.ARM]
4242
ALLOWED_BACKENDS = ["sqlite", "mysql", "postgres", "mssql"]
@@ -148,7 +148,7 @@ def get_default_platform_machine() -> str:
148148
PYTHONDONTWRITEBYTECODE = True
149149

150150
PRODUCTION_IMAGE = False
151-
ALL_PYTHON_MAJOR_MINOR_VERSIONS = ["3.7", "3.8", "3.9", "3.10"]
151+
ALL_PYTHON_MAJOR_MINOR_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11"]
152152
CURRENT_PYTHON_MAJOR_MINOR_VERSIONS = ALL_PYTHON_MAJOR_MINOR_VERSIONS
153153
CURRENT_POSTGRES_VERSIONS = ["11", "12", "13", "14", "15"]
154154
DEFAULT_POSTGRES_VERSION = CURRENT_POSTGRES_VERSIONS[0]

dev/breeze/tests/test_cache.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@
3636
[
3737
("backend", "mysql", (True, ["sqlite", "mysql", "postgres", "mssql"]), None),
3838
("backend", "xxx", (False, ["sqlite", "mysql", "postgres", "mssql"]), None),
39-
("python_major_minor_version", "3.8", (True, ["3.7", "3.8", "3.9", "3.10"]), None),
40-
("python_major_minor_version", "3.5", (False, ["3.7", "3.8", "3.9", "3.10"]), None),
39+
("python_major_minor_version", "3.8", (True, ["3.7", "3.8", "3.9", "3.10", "3.11"]), None),
40+
("python_major_minor_version", "3.5", (False, ["3.7", "3.8", "3.9", "3.10", "3.11"]), None),
4141
("missing", "value", None, AttributeError),
4242
],
4343
)

dev/breeze/tests/test_selective_checks.py

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -223,10 +223,10 @@ def assert_outputs_are_printed(expected_outputs: dict[str, str], stderr: str):
223223
pytest.param(
224224
("setup.py",),
225225
{
226-
"all-python-versions": "['3.7', '3.8', '3.9', '3.10']",
227-
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10",
228-
"python-versions": "['3.7', '3.8', '3.9', '3.10']",
229-
"python-versions-list-as-string": "3.7 3.8 3.9 3.10",
226+
"all-python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
227+
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
228+
"python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
229+
"python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
230230
"image-build": "true",
231231
"needs-helm-tests": "true",
232232
"run-tests": "true",
@@ -242,10 +242,10 @@ def assert_outputs_are_printed(expected_outputs: dict[str, str], stderr: str):
242242
pytest.param(
243243
("generated/provider_dependencies.json",),
244244
{
245-
"all-python-versions": "['3.7', '3.8', '3.9', '3.10']",
246-
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10",
247-
"python-versions": "['3.7', '3.8', '3.9', '3.10']",
248-
"python-versions-list-as-string": "3.7 3.8 3.9 3.10",
245+
"all-python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
246+
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
247+
"python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
248+
"python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
249249
"image-build": "true",
250250
"needs-helm-tests": "true",
251251
"run-tests": "true",
@@ -281,10 +281,10 @@ def test_expected_output_pull_request_main(
281281
("full tests needed",),
282282
"main",
283283
{
284-
"all-python-versions": "['3.7', '3.8', '3.9', '3.10']",
285-
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10",
286-
"python-versions": "['3.7', '3.8', '3.9', '3.10']",
287-
"python-versions-list-as-string": "3.7 3.8 3.9 3.10",
284+
"all-python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
285+
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
286+
"python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
287+
"python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
288288
"image-build": "true",
289289
"run-tests": "true",
290290
"docs-build": "true",
@@ -305,10 +305,10 @@ def test_expected_output_pull_request_main(
305305
),
306306
"main",
307307
{
308-
"all-python-versions": "['3.7', '3.8', '3.9', '3.10']",
309-
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10",
310-
"python-versions": "['3.7', '3.8', '3.9', '3.10']",
311-
"python-versions-list-as-string": "3.7 3.8 3.9 3.10",
308+
"all-python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
309+
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
310+
"python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
311+
"python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
312312
"image-build": "true",
313313
"run-tests": "true",
314314
"docs-build": "true",
@@ -327,10 +327,10 @@ def test_expected_output_pull_request_main(
327327
("full tests needed",),
328328
"main",
329329
{
330-
"all-python-versions": "['3.7', '3.8', '3.9', '3.10']",
331-
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10",
332-
"python-versions": "['3.7', '3.8', '3.9', '3.10']",
333-
"python-versions-list-as-string": "3.7 3.8 3.9 3.10",
330+
"all-python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
331+
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
332+
"python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
333+
"python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
334334
"image-build": "true",
335335
"run-tests": "true",
336336
"docs-build": "true",
@@ -349,10 +349,10 @@ def test_expected_output_pull_request_main(
349349
("full tests needed",),
350350
"v2-3-stable",
351351
{
352-
"all-python-versions": "['3.7', '3.8', '3.9', '3.10']",
353-
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10",
354-
"python-versions": "['3.7', '3.8', '3.9', '3.10']",
355-
"python-versions-list-as-string": "3.7 3.8 3.9 3.10",
352+
"all-python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
353+
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
354+
"python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
355+
"python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
356356
"image-build": "true",
357357
"run-tests": "true",
358358
"docs-build": "true",
@@ -570,8 +570,8 @@ def test_expected_output_pull_request_target(
570570
(),
571571
"main",
572572
{
573-
"all-python-versions": "['3.7', '3.8', '3.9', '3.10']",
574-
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10",
573+
"all-python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
574+
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
575575
"image-build": "true",
576576
"needs-helm-tests": "true",
577577
"run-tests": "true",
@@ -586,8 +586,8 @@ def test_expected_output_pull_request_target(
586586
(),
587587
"v2-3-stable",
588588
{
589-
"all-python-versions": "['3.7', '3.8', '3.9', '3.10']",
590-
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10",
589+
"all-python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
590+
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
591591
"image-build": "true",
592592
"needs-helm-tests": "false",
593593
"run-tests": "true",
@@ -603,8 +603,8 @@ def test_expected_output_pull_request_target(
603603
(),
604604
"main",
605605
{
606-
"all-python-versions": "['3.7', '3.8', '3.9', '3.10']",
607-
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10",
606+
"all-python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
607+
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
608608
"image-build": "true",
609609
"needs-helm-tests": "true",
610610
"run-tests": "true",
@@ -652,8 +652,8 @@ def test_no_commit_provided_trigger_full_build_for_any_event_type(github_event):
652652
)
653653
assert_outputs_are_printed(
654654
{
655-
"all-python-versions": "['3.7', '3.8', '3.9', '3.10']",
656-
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10",
655+
"all-python-versions": "['3.7', '3.8', '3.9', '3.10', '3.11']",
656+
"all-python-versions-list-as-string": "3.7 3.8 3.9 3.10 3.11",
657657
"image-build": "true",
658658
"needs-helm-tests": "true",
659659
"run-tests": "true",

dev/provider_packages/prepare_provider_packages.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
from rich.syntax import Syntax
5252
from yaml import safe_load
5353

54-
ALL_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10"]
54+
ALL_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11"]
5555

5656
INITIAL_CHANGELOG_CONTENT = """
5757

dev/retag_docker_images.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131

3232
import rich_click as click
3333

34-
PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10"]
34+
PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11"]
3535

3636
GHCR_IO_PREFIX = "ghcr.io"
3737

docs/apache-airflow/howto/upgrading-from-1-10/index.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ Airflow 1.10 was the last release series to support Python 2. Airflow 2.0.0
3434
requires Python 3.6+ and has been tested with Python versions 3.6, 3.7 and 3.8.
3535
Python 3.9 support was added from Airflow 2.1.2.
3636

37-
Airflow 2.3.0 dropped support for Python 3.6. It's tested with Python 3.7, 3.8, 3.9 and 3.10.
37+
Airflow 2.3.0 dropped support for Python 3.6. It's tested with Python 3.7, 3.8, 3.9, 3.10, 3.11.
3838

3939
If you have a specific task that still requires Python 2 then you can use the ``@task.virtualenv``, ``@task.docker`` or ``@task.kubernetes`` decorators for this.
4040

docs/apache-airflow/installation/prerequisites.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Prerequisites
2020

2121
Starting with Airflow 2.3.0, Airflow is tested with:.
2222

23-
* Python: 3.7, 3.8, 3.9, 3.10
23+
* Python: 3.7, 3.8, 3.9, 3.10, 3.11
2424

2525
* Databases:
2626

0 commit comments

Comments
 (0)