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 an FTP connection object.
docstr_tok: ["Return","an","FTP","connection","object","."]
code: def get_conn(self) -> ftplib.FTP:
      """Return an FTP connection object."""
      if self.conn is None:
          params = self.get_connection(self.ftp_conn_id)
          pasv = params.extra_dejson.get("passive", True)
          self.conn = ftplib.FTP(
              params.host, params.login, params.password
          )  # nosec: B321
          self.conn.set_pasv(pasv)
  
      return self.conn
  
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 4 for calling the FTPHook obj's underlying member method code with example usage: obj.get_conn() and returns: self