@tamara : Correct, we are now proposing to remove overriding the pre/post
execute

>Quick question if I am understanding the proposed change correctly.


What you want to remove is overriding the pre/post execute when creating
> custom operators:
>
> class MyOperator(BaseOperator):
>
>     ...
>
>     def pre_execute(self, context):   # This would break?
>         ....
>     def post_execute(self, context):   # And this as well?
> But keep the (currently experimental) use of the pre_execute and
> post_execute parameters (I've only used post_execute before for similar
> reasons as TP posted, interacting with outlets assets)


On Sat, 29 Mar 2025 at 18:23, Kaxil Naik <kaxiln...@gmail.com> wrote:

> No, @run_if / @skip_if uses pre_execute from task argument [1] not the the
> method and is just a syntactic sugar. You can also do the following as an
> example:
>
> ```
> def skip_at_random(context):
>     if randint(0, 1) == 0:
>         raise AirflowSkipException()
>
> t2 = BashOperator(task_id='conditional2', pre_execute=skip_at_random,
> dag=dag, bash_command="airflow version")
> ```
>
> [1]:
> https://github.com/apache/airflow/blob/8c3a30e3ffc3f114c1d2cc3e6e109f4d9e29ca8b/airflow-core/src/airflow/decorators/condition.py#L57-L59
>
> On Sat, 29 Mar 2025 at 05:09, Matthew Block <matthew.l.bl...@gmail.com>
> wrote:
>
>> Would this also break @run_if/@skip_if decorators?
>>
>> Best,
>> Matt Block
>>
>> > On Mar 28, 2025, at 3:44 PM, Tamara Fingerlin
>> <tamara.finger...@astronomer.io.invalid> wrote:
>> >
>> > Hey :)
>> >
>> > Quick question if I am understanding the proposed change correctly.
>> >
>> > What you want to remove is overriding the pre/post execute when creating
>> > custom operators:
>> >
>> > class MyOperator(BaseOperator):
>> >    ...
>> >    def pre_execute(self, context):   # This would break?
>> >        ....
>> >
>> >    def post_execute(self, context):   # And this as well?
>> >
>> >
>> > But keep the (currently experimental) use of the pre_execute and
>> > post_execute parameters (I've only used post_execute before for similar
>> > reasons as TP posted, interacting with outlets assets)
>> >
>> >    BashOperator(
>> >        task_id='hello_world',
>> >        bash_command='sleep 5',
>> >        pre_execute=lambda context: print("Pre-execute function
>> called!"),
>> > # this would still work?
>> >        post_execute=lambda context: print("Post-execute function
>> > called!"),   # this would be supposed to still work (it does not rn 😅)
>> >    )
>> >
>> > The one situation I am worried about here is larger teams/orgs using pre
>> > and post execute to standardize custom operators. For example team A
>> writes
>> > OurCompanyDatabaseBaseOperator that has a pre_execute and post_execute
>> with
>> > mandatory business logic and team B is allowed to write custom
>> operators on
>> > top of that but only override execute.
>> > I assume this would break?
>> >
>> >
>> >> On Fri, Mar 28, 2025 at 9:32 PM Jarek Potiuk <ja...@potiuk.com> wrote:
>> >>
>> >> I think the current proposal is to remove the pre/post in the Base
>> Operator
>> >> class (and overridability) and leave passing pre/post as constructor
>> >> arguments..
>> >>
>> >>> On Fri, Mar 28, 2025 at 9:20 PM Bolke de Bruin <bdbr...@gmail.com>
>> wrote:
>> >>>
>> >>> Just one thing - the pre / post mechanisms are executed in-process of
>> the
>> >>> task rather than the DAG. So they are not equal to setup/teardown. Are
>> >> you
>> >>> proposing to remove the argument or the whole thing?
>> >>>
>> >>> B.
>> >>>
>> >>>
>> >>>
>> >>>> On Fri, 28 Mar 2025 at 20:58, Jarek Potiuk <ja...@potiuk.com> wrote:
>> >>>
>> >>>> Indeed. Post/pre overriding in sub-classes should go away (and we
>> could
>> >>>> even likely implement a ruff rule to auto-fix those if someone has a
>> >>> custom
>> >>>> executor. Sounds like 100% doable
>> >>>>
>> >>>> But passing them as "cross-cutting concerns" via callable in a
>> >>> constructor
>> >>>> is pretty useful and not easily fixable for back-compatibilty
>> >>>>
>> >>>> J.
>> >>>>
>> >>>> On Fri, Mar 28, 2025 at 6:14 PM Kaxil Naik <kaxiln...@gmail.com>
>> >> wrote:
>> >>>>
>> >>>>>> I think the ability of overriding pre_execute and post_execute in a
>> >>>>> subclass can definitely go away. They are practically useles; you
>> can
>> >>>> just
>> >>>>> put everything in execute, which always needs to exist in a
>> >>> BaseOperator
>> >>>>> subclass anyway.
>> >>>>>
>> >>>>> Yeah I am fine with removing that then. Anyone disagrees?
>> >>>>>
>> >>>>> On Fri, 28 Mar 2025 at 20:36, Michał Modras <
>> michalmod...@google.com
>> >>>>> .invalid>
>> >>>>> wrote:
>> >>>>>
>> >>>>>> I'd prefer a world without separate pre_execute and post_execute
>> >>>>> functions
>> >>>>>> - as pointed out in the PR, they make reasoning about DAGs more
>> >>>> complex,
>> >>>>>> and can be error prone.
>> >>>>>>
>> >>>>>> Having said that, I know there are multiple users relying on these
>> >>>>>> functionalities, so I'll bring up my usual - another breaking
>> >> change
>> >>> -
>> >>>>>> another obstacle to the AF3 adoption argument.
>> >>>>>>
>> >>>>>> And as for relying on operators vs. PythonOperator + hooks - there
>> >>> are
>> >>>>> good
>> >>>>>> arguments for continuing relying on operators, or even rely on them
>> >>>> more,
>> >>>>>> depending on customers' need and organizational setup.
>> >>>>>>
>> >>>>>> On Fri, Mar 28, 2025 at 3:42 PM Tzu-ping Chung
>> >>>> <t...@astronomer.io.invalid
>> >>>>>>
>> >>>>>> wrote:
>> >>>>>>
>> >>>>>>> Passing post_execute as an argument is somewhat useful for
>> >>> operators
>> >>>>> that
>> >>>>>>> don’t support assets natively (most of them) but when you want to
>> >>>> emit
>> >>>>> a
>> >>>>>>> dynamic path. For example:
>> >>>>>>>
>> >>>>>>> def _send_asset_event(context, result):
>> >>>>>>>    # Rendered value!
>> >>>>>>>    name = context["task"].output
>> >>>>>>>    # Trigger an event against the emitted path.
>> >>>>>>>    context["outlet_events"][write_data_outlet].add(Asset(name))
>> >>>>>>>
>> >>>>>>> write_data_outlet = AssetAlias("data")
>> >>>>>>>
>> >>>>>>> WriteSomeDataOperator(
>> >>>>>>>    task_id="write_data",
>> >>>>>>>    output="write_data_{{ run_id }}.parquet",
>> >>>>>>>    outlets=[write_data_outlet],
>> >>>>>>>    post_execute=_send_asset_event,
>> >>>>>>> )
>> >>>>>>>
>> >>>>>>> Without the functionality, you’ll have to write a subclass for
>> >> each
>> >>>>>>> operator you want to do this, which is quite a bit boilerplate.
>> >>>>>>>
>> >>>>>>> Arguably this is only needed since we use operators too much.
>> >> This
>> >>>>>>> wouldn’t be an issue if we rely more on the PythonOperator+hooks
>> >>>>> approach
>> >>>>>>> (like Bolke discussed at last year’s Airflow Summit), but alas,
>> >>>> people
>> >>>>>>> don’t like to change how they do things, and operators are still
>> >>> very
>> >>>>>>> popular.
>> >>>>>>>
>> >>>>>>> The pre_execute argument *might* also be useful if you want to
>> >>>>>> pre-process
>> >>>>>>> some values. That’s probably a lot less common, so I wouldn’t
>> >> fret
>> >>>> too
>> >>>>>> much
>> >>>>>>> if it goes away. However, since post_execute and pre_execute
>> >>>> basically
>> >>>>>> use
>> >>>>>>> the same implementation, just one run right before and one right
>> >>>> after
>> >>>>>>> execute, they should probably stay or go together.
>> >>>>>>>
>> >>>>>>> I think the ability of overriding pre_execute and post_execute
>> >> in a
>> >>>>>>> subclass can definitely go away. They are practically useles; you
>> >>> can
>> >>>>>> just
>> >>>>>>> put everything in execute, which always needs to exist in a
>> >>>>> BaseOperator
>> >>>>>>> subclass anyway.
>> >>>>>>>
>> >>>>>>> TP
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>> On 28 Mar 2025, at 22:12, Kaxil Naik <kaxiln...@gmail.com>
>> >>> wrote:
>> >>>>>>>>
>> >>>>>>>> I am in favor of dropping support as they essentially do the
>> >> same
>> >>>> --
>> >>>>>> and
>> >>>>>>>> setup & teardown is more "native" (first-class UI support)
>> >>>>>>>>
>> >>>>>>>> On Fri, 28 Mar 2025 at 19:41, Kaxil Naik <kaxiln...@gmail.com>
>> >>>>> wrote:
>> >>>>>>>>
>> >>>>>>>>> Hi team,
>> >>>>>>>>>
>> >>>>>>>>> Should we drop support for pre_execute and post_execute for AF
>> >>>> 3.0?
>> >>>>>> They
>> >>>>>>>>> are still marked as experimental [1]. They were added [2] in a
>> >>>> world
>> >>>>>>>>> without Setup and Teardown tasks.
>> >>>>>>>>>
>> >>>>>>>>> Regards,
>> >>>>>>>>>
>> >>>>>>>>> Kaxil
>> >>>>>>>>>
>> >>>>>>>>>
>> >>>>>>>>> [1]:
>> >>>>>>>>>
>> >>>>>>>
>> >>>>>>
>> >>>>>
>> >>>>
>> >>>
>> >>
>> https://github.com/apache/airflow/blob/7af0319ba16749f4aea78085dfe7823f321d262a/task-sdk/src/airflow/sdk/bases/baseoperator.py#L715-L724
>> >>>>>>>>> [2]: https://github.com/apache/airflow/pull/17576
>> >>>>>>>>>
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>
>> >>> ---------------------------------------------------------------------
>> >>>>>>> To unsubscribe, e-mail: dev-unsubscr...@airflow.apache.org
>> >>>>>>> For additional commands, e-mail: dev-h...@airflow.apache.org
>> >>>>>>>
>> >>>>>>>
>> >>>>>>
>> >>>>>
>> >>>>
>> >>>
>> >>>
>> >>> --
>> >>>
>> >>> --
>> >>> Bolke de Bruin
>> >>> bdbr...@gmail.com
>> >>>
>> >>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscr...@airflow.apache.org
>> For additional commands, e-mail: dev-h...@airflow.apache.org
>>
>>

Reply via email to