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