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 __init__(self, name, canonical_name, country_code):
      self.name = name
  
      if canonical_name is None:
          canonical_name = name
  
      self.canonical_name = canonical_name
      self.country_code = country_code.upper()
  
imports: from zipline.utils.calendars import get_calendar
label_desc: Use image node_id 1 to create a new ExchangeInfo object from inherited base classes: object with example: obj = ExchangeInfo(name, canonical_name, country_code)