Hi.

Thank you for your comments!

I actually didn't realize that those (airflow.operators.python_operator,
...) were Airflow 1 imports.
I had them in my Airflow 2 instance, and I was under the impression that
DAG that is working in Airflow 2 should work in Airflow 3, but apparently
not.

After changing imports from (airflow.operators.python, ...), DAGs are now
parsed fine.

Thank you for your responses.

- Eugene

On Wed, Apr 2, 2025 at 4:11 AM Wei Lee <weilee...@gmail.com> wrote:

> Hi Kaxil,
>
> > Instead handle it via ruff rules AIR2 something
>
> Does that mean we need to add an `AIR2` for `_operator`? In the current
> implementation, they are in `AIR303` (moved to provider).
>
> It also raises a new thing I'd like to confirm.
> We're to mark the suggested change for `airflow.operators.python` as they
> are supposed to work ok on Airflow 3, but it would be better to change them
> to a standard provider.
> For `airflow.operators.python_operator`, it sounds like something is no
> longer working in Airflow 3. If this is the case, we probably need to mark
> them as required changes in Airflow 3 and suggested changes in AIR2?
>
>
> ---
>
> ferruzzi,
>
> > But to the original topic,  an AF2-AF3 ruff rule was "always" the plan
> AFAIK.  I've lost track of who is working on what at this point
>
> I'm working on the ruff thing. AIR3 things only for now, though.
>
> ---
>
> Tamara,
>
> > but might change to "AIR30" for crucial changes and "AIR31" for suggested
> changes
>
> We already reached a consensus with the ruff team but will need some time
> to implement it.
>
> https://github.com/astral-sh/ruff/issues/14626#issuecomment-2766146129
>
> ---
>
>
> Best,
> Wei
>
> > On Apr 2, 2025, at 1:06 AM, Tamara Fingerlin
> <tamara.finger...@astronomer.io.INVALID> wrote:
> >
> > Hi Eugen
> >
> > As others have said
> >    from airflow.operators.python_operator import PythonOperator
> > has been deprecated a long time ago and wont work anymore in Airflow 3.
> >
> >    from airflow.operators.python import PythonOperator
> > which was the preferred import for recent years is going to get
> deprecated
> > for Airflow 3 but will still work in 3.0 (likely will be removed
> eventually)
> >
> > and the new preferred import will be from standard providers:
> >    from airflow.providers.standard.operators.python import PythonOperator
> >
> > There is a ruff rule in the works (
> > https://docs.astral.sh/ruff/rules/#airflow-air) it currently is "AIR3"
> but
> > might change to "AIR30" for crucial changes and "AIR31" for suggested
> > changes and it is still being worked on (currently it would catch the
> > removed import from python_operator but recommend the deprecated
> statement,
> > not the one from standard providers yet).
> >
> >    ruff check --preview --select AIR3
> > is the command right now if you want to test, but I'd wait until Airflow
> 3
> > release so it is all final. There will also be upgrading guides. :)
> >
> >
> >
> > On Tue, Apr 1, 2025 at 6:52 PM Ferruzzi, Dennis
> <ferru...@amazon.com.invalid>
> > wrote:
> >
> >> IMHO, if they were deprecated that long ago then adding a ruff rule is
> >> just enabling the users to ignore the deprecation.  They should
> >> /eventually/ have to clear some of their tech debt and actually update
> >> their code to modern standards, no?  They've had four and half YEARS of
> >> warning at this point.  But to the original topic,  an AF2-AF3 ruff rule
> >> was "always" the plan AFAIK.  I've lost track of who is working on what
> at
> >> this point, but I know I heard talk about that almost since the
> beginning,
> >> no?  That seems like as good of a place as any to handle this redirect.
> >>
> >>
> >> - ferruzzi
> >>
> >>
> >> ________________________________
> >> From: Jarek Potiuk <ja...@potiuk.com>
> >> Sent: Tuesday, April 1, 2025 9:32 AM
> >> To: dev@airflow.apache.org
> >> Subject: RE: [EXT] [DISCUSSION] Airflow 2 DAGs compatible with Airflow 3
> >>
> >> CAUTION: This email originated from outside of the organization. Do not
> >> click links or open attachments unless you can confirm the sender and
> know
> >> the content is safe.
> >>
> >>
> >>
> >> AVERTISSEMENT: Ce courrier électronique provient d’un expéditeur
> externe.
> >> Ne cliquez sur aucun lien et n’ouvrez aucune pièce jointe si vous ne
> pouvez
> >> pas confirmer l’identité de l’expéditeur et si vous n’êtes pas certain
> que
> >> le contenu ne présente aucun risque.
> >>
> >>
> >>
> >> Ah.. I missed that we have those _operators ... Those indeed should have
> >> been fixed a long time ago and automated conversion rules from ruff
> >> should be fixing them.
> >>
> >> On Tue, Apr 1, 2025 at 6:17 PM Kaxil Naik <kaxiln...@gmail.com> wrote:
> >>
> >>> Those were deprecated 4.5+ years ago:
> >>>
> >>>
> >>
> https://github.com/apache/airflow/blob/2.0.0/airflow/operators/python_operator.py
> >>>
> >>> On Tue, 1 Apr 2025 at 21:45, Kaxil Naik <kaxiln...@gmail.com> wrote:
> >>>
> >>>> Instead handle it via ruff rules AIR2 something
> >>>>
> >>>> On Tue, 1 Apr 2025 at 21:44, Kaxil Naik <kaxiln...@gmail.com> wrote:
> >>>>
> >>>>> `  - ModuleNotFoundError: No module named
> >>>>> 'airflow.operators.python_operator'`  <-- those paths are Airflow 1.x
> >>> old
> >>>>>
> >>>>> We had already stripped `_operator` from the module names in Airflow
> >>>>> 2.0.0 -- so IMO there is no need to keep back-compatibility for
> >>> something
> >>>>> that was working 2 major versions ago
> >>>>>
> >>>>> On Tue, 1 Apr 2025 at 17:23, Jarek Potiuk <ja...@potiuk.com> wrote:
> >>>>>
> >>>>>> An example where deprection_tools are still used
> >>>>>>
> >>>>>>
> >>>
> >>
> https://github.com/apache/airflow/blob/main/airflow-core/src/airflow/utils/log/__init__.py
> >>>>>>
> >>>>>> It's rather straightforward = needs a package with __init__.py -
> only
> >>>>>> where
> >>>>>> you list all the classes and provide redirections. It will
> >>>>>> automatically raise deprecation warnings:
> >>>>>>
> >>>>>> from airflow.utils.deprecation_tools import add_deprecated_classes
> >>>>>>
> >>>>>> __deprecated_classes = {
> >>>>>>    "cloudwatch_task_handler": {
> >>>>>>        "CloudwatchTaskHandler": (
> >>>>>>
> >>>>>>
> >>>>>>
> >>>
> >>
> "airflow.providers.amazon.aws.log.cloudwatch_task_handler.CloudwatchTaskHandler"
> >>>>>>        ),
> >>>>>>    },
> >>>>>>    "es_task_handler": {
> >>>>>>        "ElasticsearchTaskHandler": (
> >>>>>>
> >>>>>>
> >>>>>>
> >>>
> >>
> "airflow.providers.elasticsearch.log.es_task_handler.ElasticsearchTaskHandler"
> >>>>>>        ),
> >>>>>>    },
> >>>>>>    "gcs_task_handler": {
> >>>>>>        "GCSTaskHandler":
> >>>>>> "airflow.providers.google
> >> .cloud.log.gcs_task_handler.GCSTaskHandler",
> >>>>>>    },
> >>>>>>    "s3_task_handler": {
> >>>>>>        "S3TaskHandler":
> >>>>>> "airflow.providers.amazon.aws.log.s3_task_handler.S3TaskHandler",
> >>>>>>    },
> >>>>>>    "stackdriver_task_handler": {
> >>>>>>        "StackdriverTaskHandler": (
> >>>>>>
> >>>>>> "airflow.providers.google
> >>>>>> .cloud.log.stackdriver_task_handler.StackdriverTaskHandler"
> >>>>>>        ),
> >>>>>>    },
> >>>>>>    "wasb_task_handler": {
> >>>>>>        "WasbTaskHandler":
> >>>>>>
> >>>>>>
> >>>
> >>
> "airflow.providers.microsoft.azure.log.wasb_task_handler.WasbTaskHandler",
> >>>>>>    },
> >>>>>> }
> >>>>>>
> >>>>>> add_deprecated_classes(__deprecated_classes, __name__)
> >>>>>>
> >>>>>> On Tue, Apr 1, 2025 at 1:49 PM Jarek Potiuk <ja...@potiuk.com>
> >> wrote:
> >>>>>>
> >>>>>>> We were going to have compatibility shims to redirect the imports -
> >>>>>> with -
> >>>>>>> there are few ways to do it - Ash had a little POC with module
> >>> loader,
> >>>>>> but
> >>>>>>> I think it has some potential side effect and I think Ash abandoned
> >>>>>>> the idea and I would personally prefer to use our old PEP-563
> >>> mechanism
> >>>>>>> using airflow-core/src/airflow/utils/deprecation_tools.py,
> >>>>>>>
> >>>>>>> Very nice and small PR to implement if you  want to contribute -
> >> and
> >>>>>> since
> >>>>>>> you are testing it now with some existing DAGS it might also be a
> >>> good
> >>>>>> test
> >>>>>>> if no redirect has been forgotten
> >>>>>>>
> >>>>>>> J.
> >>>>>>>
> >>>>>>>
> >>>>>>> On Tue, Apr 1, 2025 at 1:32 PM Eugen Kosteev <eu...@kosteev.com>
> >>>>>> wrote:
> >>>>>>>
> >>>>>>>> Hi everyone.
> >>>>>>>>
> >>>>>>>> I am testing compatibility of Airflow 2 DAGs with Airflow 3, and
> >>> would
> >>>>>>>> like
> >>>>>>>> to discuss this topic.
> >>>>>>>>
> >>>>>>>> I took bunch of DAGs from existing Airflow 2 instances and
> >> deployed
> >>>>>> them
> >>>>>>>> to
> >>>>>>>> instance with Airflow 3 (3.0.0b4) and have bunch of import errors:
> >>>>>>>>  - ModuleNotFoundError: No module named
> >>>>>>>> 'airflow.operators.python_operator'
> >>>>>>>>  - ModuleNotFoundError: No module named
> >>>>>> 'airflow.operators.bash_operator'
> >>>>>>>>  - ImportError: cannot import name 'email_operator' from
> >>>>>>>> 'airflow.operators'
> >>>>>>>>  - ModuleNotFoundError: No module named
> >>>>>>>> 'airflow.operators.dummy_operator'
> >>>>>>>>
> >>>>>>>> I know that users are supposed to migrate from using
> >>>>>> "airflow.operators"
> >>>>>>>> to
> >>>>>>>> standard/stmp/.. provider packages before upgrading to Airflow 3.
> >>>>>>>>
> >>>>>>>> But I also remember some discussions around keeping old imports
> >>> work,
> >>>>>> by
> >>>>>>>> rerouting them to the correct module (similarly as we do in case
> >> of
> >>>>>>>> deprecated classes, etc.).
> >>>>>>>> So, it will be very smooth for users to migrate to Airflow 3.
> >>>>>>>>
> >>>>>>>> What is our stand on this? Do we abandon "airflow.operators" usage
> >>> in
> >>>>>> DAGs
> >>>>>>>> in Airflow 3 completely?
> >>>>>>>> Or this is something that needs to be done in Airflow 3, but not
> >>> yet.
> >>>>>>>>
> >>>>>>>> --
> >>>>>>>> Eugene
> >>>>>>>>
> >>>>>>>
> >>>>>>
> >>>>>
> >>>
> >>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@airflow.apache.org
> For additional commands, e-mail: dev-h...@airflow.apache.org
>
>

-- 
Eugene

Reply via email to