code: def do_attr(environment, obj, name):
      
      try:
          name = str(name)
      except UnicodeError:
          pass
      else:
          try:
              value = getattr(obj, name)
          except AttributeError:
              pass
          else:
              if environment.sandboxed and not \
                 environment.is_safe_attribute(obj, name, value):
                  return environment.unsafe_undefined(obj, name)
              return value
      return environment.undefined(obj=obj, name=name)
docs: Get an attribute of an object.  ``foo|attr("bar")`` works like
      ``foo.bar`` just that always an attribute is returned and items are not
      looked up.
  
      See :ref:`Notes on subscriptions <notes-on-subscriptions>` for more details.