shivaam commented on code in PR #64751:
URL: https://github.com/apache/airflow/pull/64751#discussion_r3038039760


##########
airflow-core/src/airflow/serialization/encoders.py:
##########
@@ -210,9 +210,22 @@ def encode_deadline_alert(d: DeadlineAlert | 
SerializedDeadlineAlert) -> dict[st
     """
     from airflow.sdk.serde import serialize
 
+    if isinstance(d, dict):
+        return d
+
+    interval = d.interval
+
+    # Resolve dynamic interval providers (e.g. VariableInterval)
+    resolve = getattr(interval, "resolve", None)
+    if callable(resolve):
+        interval = resolve()
+

Review Comment:
   getattr(interval, "resolve", None) will call .resolve() on any object that 
has it, not just VariableInterval. For example, if someone accidentally passes 
an object with an unrelated .resolve() that returns a string, the encoder calls 
it and then crashes later with a confusing error. We can use a Protocol so the 
contract is explicit and caught at lint time.
   
   ```
   # With Protocol — explicit contract
   from typing import Protocol
   
   class ResolvableInterval(Protocol):
       def resolve(self) -> timedelta: ...
   
   # Now you can use it in type annotations:
   def __init__(self, interval: timedelta | ResolvableInterval): ...
   
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to