class_docstr: An exchange where assets are traded.
  
  Parameters
  ----------
  name : str or None
      The full name of the exchange, for example 'NEW YORK STOCK EXCHANGE' or
      'NASDAQ GLOBAL MARKET'.
  canonical_name : str
      The canonical name of the exchange, for example 'NYSE' or 'NASDAQ'. If
      None this will be the same as the name.
  country_code : str
      The country code where the exchange is located.
  
  Attributes
  ----------
  name : str or None
      The full name of the exchange, for example 'NEW YORK STOCK EXCHANGE' or
      'NASDAQ GLOBAL MARKET'.
  canonical_name : str
      The canonical name of the exchange, for example 'NYSE' or 'NASDAQ'. If
      None this will be the same as the name.
  country_code : str
      The country code where the exchange is located.
  calendar : TradingCalendar
      The trading calendar the exchange uses.
code: def __eq__(self, other):
      if not isinstance(other, ExchangeInfo):
          return NotImplemented
  
      return all(
          getattr(self, attr) == getattr(other, attr)
          for attr in ("name", "canonical_name", "country_code")
      )
  
imports: from zipline.utils.calendars import get_calendar
label_desc: Use image node_id 4 for calling the ExchangeInfo obj's underlying member method code with example usage: obj.__eq__(other) and returns: all, NotImplemented