This is an automated email from the ASF dual-hosted git repository.
shahar1 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 5799f9d672b Cache BaseOperator signature in OperatorSerialization
(#67701)
5799f9d672b is described below
commit 5799f9d672b80d01556b70eace88238d7b61665c
Author: Shahar Epstein <[email protected]>
AuthorDate: Fri May 29 14:57:14 2026 +0300
Cache BaseOperator signature in OperatorSerialization (#67701)
---
airflow-core/src/airflow/serialization/serialized_objects.py | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/airflow-core/src/airflow/serialization/serialized_objects.py
b/airflow-core/src/airflow/serialization/serialized_objects.py
index cfe4efa6275..a98751de590 100644
--- a/airflow-core/src/airflow/serialization/serialized_objects.py
+++ b/airflow-core/src/airflow/serialization/serialized_objects.py
@@ -964,6 +964,12 @@ class OperatorSerialization(DAGNode, BaseSerialization):
_const_fields: ClassVar[set[str] | None] = None
+ # Parameters of BaseOperator.__init__ that must not appear in
template_fields.
+ # Computed once at class-load time: the signature never changes during a
process.
+ _FORBIDDEN_TEMPLATE_FIELDS: ClassVar[frozenset[str]] = frozenset(
+ signature(BaseOperator.__init__).parameters
+ ) - {"email"}
+
@classmethod
def serialize_mapped_operator(cls, op: MappedOperator) -> dict[str, Any]:
serialized_op = cls._serialize_node(op)
@@ -1044,9 +1050,7 @@ class OperatorSerialization(DAGNode, BaseSerialization):
# Store all template_fields as they are if there are JSON Serializable
# If not, store them as strings
# And raise an exception if the field is not templateable
- forbidden_fields =
set(signature(BaseOperator.__init__).parameters.keys())
- # Though allow some of the BaseOperator fields to be templated anyway
- forbidden_fields.difference_update({"email"})
+ forbidden_fields = cls._FORBIDDEN_TEMPLATE_FIELDS
if op.template_fields:
for template_field in op.template_fields:
if template_field in forbidden_fields: