class_docstr: Interact with FTP.
  
  Errors that may occur throughout but should be handled downstream.
  You can specify mode for data transfers in the extra field of your
  connection as ``{"passive": "true"}``.
  
  :param ftp_conn_id: The :ref:`ftp connection id <howto/connection:ftp>`
      reference.
class_docstr_tok: ["Interact","with","FTP",".","Errors","that","may","occur","throughout","but","should","be","handled","downstream",".","You","can","specify","mode","for","data","transfers","in","the","extra","field","of","your","connection","as","``","{","``","passive","''",":","``","true","''","}","``",".",":","param","ftp_conn_id",":","The",":","ref",":","`","ftp","connection","id","<","howto\/connection",":","ftp",">","`","reference","."]
docstr: Return a dictionary of {filename: {attributes}} for all files on a remote system which supports MLSD.
  
  :param path: full path to the remote directory
docstr_tok: ["Return","a","dictionary","of","{","filename",":","{","attributes","}","}","for","all","files","on","a","remote","system","which","supports","MLSD",".",":","param","path",":","full","path","to","the","remote","directory"]
code: def describe_directory(self, path: str) -> dict:
      """
      Return a dictionary of {filename: {attributes}} for all files on a remote system which supports MLSD.
  
      :param path: full path to the remote directory
      """
      conn = self.get_conn()
      return dict(conn.mlsd(path))
  
imports: from __future__ import annotations
  import datetime
  import ftplib
  from typing import Any, Callable
  from airflow.hooks.base import BaseHook
label_desc: Use image node_id 6 for calling the FTPHook obj's underlying member method code with example usage: obj.describe_directory(path) and returns: dict