docstr: Construct a :class:`~perspective.Table` using the provided data or
  schema and optional configuration dictionary.
  
  :class:`~perspective.Table` instances are immutable - column names and
  data types cannot be changed after creation. If a schema is provided,
  the :class:`~perspective.Table` will be empty.  Subsequent updates MUST
  conform to the column names and data types provided in the schema.
  
  Args:
      data (:obj:`dict`/:obj:`list`/:obj:`pandas.DataFrame`): Data or
          schema which initializes the :class:`~perspective.Table`.
  
  Keyword Args:
      index (:obj:`str`): A string column name to use as the
          :class:`~perspective.Table` primary key.
      limit (:obj:`int`): The maximum number of rows the
          :class:`~perspective.Table` should have.  Cannot be set at the
          same time as ``index``. Updates past the limit will begin
          writing at row 0.
docstr_tok: ["Construct","a",":","class",":","`","~perspective.Table","`","using","the","provided","data","or","schema","and","optional","configuration","dictionary",".",":","class",":","`","~perspective.Table","`","instances","are","immutable","-","column","names","and","data","types","can","not","be","changed","after","creation",".","If","a","schema","is","provided",",","the",":","class",":","`","~perspective.Table","`","will","be","empty",".","Subsequent","updates","MUST","conform","to","the","column","names","and","data","types","provided","in","the","schema",".","Args",":","data","(",":","obj",":","`","dict","`","\/",":","obj",":","`","list","`","\/",":","obj",":","`","pandas.DataFrame","`",")",":","Data","or","schema","which","initializes","the",":","class",":","`","~perspective.Table","`",".","Keyword","Args",":","index","(",":","obj",":","`","str","`",")",":","A","string","column","name","to","use","as","the",":","class",":","`","~perspective.Table","`","primary","key",".","limit","(",":","obj",":","`","int","`",")",":","The","maximum","number","of","rows","the",":","class",":","`","~perspective.Table","`","should","have",".","Can","not","be","set","at","the","same","time","as","``","index","``",".","Updates","past","the","limit","will","begin","writing","at","row","0","."]
code: def __init__(self, data, limit=None, index=None):
      """Construct a :class:`~perspective.Table` using the provided data or
      schema and optional configuration dictionary.
  
      :class:`~perspective.Table` instances are immutable - column names and
      data types cannot be changed after creation. If a schema is provided,
      the :class:`~perspective.Table` will be empty.  Subsequent updates MUST
      conform to the column names and data types provided in the schema.
  
      Args:
          data (:obj:`dict`/:obj:`list`/:obj:`pandas.DataFrame`): Data or
              schema which initializes the :class:`~perspective.Table`.
  
      Keyword Args:
          index (:obj:`str`): A string column name to use as the
              :class:`~perspective.Table` primary key.
          limit (:obj:`int`): The maximum number of rows the
              :class:`~perspective.Table` should have.  Cannot be set at the
              same time as ``index``. Updates past the limit will begin
              writing at row 0.
      """
      self._is_arrow = isinstance(data, (bytes, bytearray))
      self._is_csv = isinstance(data, str)
  
      if self._is_csv:
          # CSVs are loaded using the Arrow interface, so is_arrow is
          # always true if we are loading a CSV
          self._is_arrow = True
  
          if len(data) > 0 and data[0] == ",":
              data = "_" + data
  
      if self._is_arrow:
          _accessor = data
      else:
          _accessor = _PerspectiveAccessor(data)
  
      self._date_validator = _PerspectiveDateValidator()
  
      self._limit = limit
      self._index = index
  
      # C++ make_table does not accept `None`, so pass in defaults of ""
      # for `index` and 4294967295 for `limit`, but always store `self._index`
      # and `self._limit` as user-provided kwargs or `None`.
      self._table = make_table(
          _accessor,
          self._limit or 4294967295,
          self._index or "",
          t_op.OP_INSERT,
          self._is_arrow,
          self._is_csv,
          0,
      )
  
      self._gnode_id = self._table.get_gnode().get_id()
      self._update_callbacks = _PerspectiveCallBackCache()
      self._delete_callbacks = _PerspectiveCallBackCache()
      self._views = []
      self._delete_callback = None
  
      pool = self._table.get_pool()
      pool.set_update_delegate(self)
      pool._process()
  
      # Each table always contains its own instance of state manager.
      self._state_manager = _PerspectiveStateManager()
  
imports: from datetime import date, datetime
  from ..core.exception import PerspectiveError
  from ._accessor import _PerspectiveAccessor
  from ._callback_cache import _PerspectiveCallBackCache
  from ._date_validator import _PerspectiveDateValidator
  from ._state import _PerspectiveStateManager
  from ._utils import _dtype_to_pythontype, _dtype_to_str, _parse_expression_inputs, _str_to_pythontype
  from .libpsppy import make_table, update_table, str_to_filter_op, t_dtype, t_filter_op, t_op, validate_expressions
  from .view import View
label_desc: Use image node_id 1 to create a new Table object from inherited base classes: object with example: obj = Table(data, limit, index)