docstr: Allow access to ``_`` prefix vars (but not ``__``).
  
  Unlike the stock SandboxedEnvironment, we allow access to "private" attributes (ones starting with
  ``_``) whilst still blocking internal or truly private attributes (``__`` prefixed ones).
docstr_tok: ["Allow","access","to","``","_","``","prefix","vars","(","but","not","``","__","``",")",".","Unlike","the","stock","SandboxedEnvironment",",","we","allow","access","to","``","private","''","attributes","(","ones","starting","with","``","_","``",")","whilst","still","blocking","internal","or","truly","private","attributes","(","``","__","``","prefixed","ones",")","."]
code: def is_safe_attribute(self, obj, attr, value):
      """
      Allow access to ``_`` prefix vars (but not ``__``).
  
      Unlike the stock SandboxedEnvironment, we allow access to "private" attributes (ones starting with
      ``_``) whilst still blocking internal or truly private attributes (``__`` prefixed ones).
      """
      return not jinja2.sandbox.is_internal_attribute(obj, attr)
  
file_path: airflow/airflow/templates.py
imports: from __future__ import annotations
  from typing import TYPE_CHECKING
  import jinja2.nativetypes
  import jinja2.sandbox
label_desc: Use image node_id 2 for calling the _AirflowEnvironmentMixin obj's underlying member method code with example usage: obj.is_safe_attribute(obj, attr, value) and returns: unknown