code: def c(self, *args, **kwargs):
          
          # If not arguments, print everything
          if len(args) + len(kwargs) == 0:
              
              print("Columns")
              if len(self.ckeys)==0: print ('  No columns of data yet.')
              
              # Loop over the ckeys and display their information
              for n in range(len(self.ckeys)):
                  print('  '+str(n)+': '+str(self.ckeys[n])+' '+str(_n.shape(self[n])))
              return
  
          # Otherwise, find n        
          elif len(args):   n = args[0]
          elif len(kwargs): 
              for k in kwargs: n = kwargs[k]
          
          # Nothing to do here.
          if len(self.columns) == 0:   return None
          
          # if it's a string, use it as a key for the dictionary
          if type(n)   is str: return self.columns[n]
  
          # if it's a list, return the specified columns
          if type(n) in [list, tuple, range]:
              output = []
              for i in n: output.append(self[i])
              return output
  
          # If it's a slice, do the slice thing
          if type(n) is slice:
              start = n.start
              stop  = n.stop
              step  = n.step
  
              # Fix up the unspecifieds
              if start == None: start = 0
              if stop  == None or stop>len(self): stop  = len(self)
              if step  == None: step  = 1
              
              # Return what was asked for
              return self[range(start, stop, step)]
              
          # Otherwise assume it's an integer
          return self.columns[self.ckeys[n]]
docs: Takes a single argument or keyword argument, and returns the specified 
          column. If the argument (or keyword argument) is an integer, return the 
          n'th column, otherwise return the column based on key.
          
          If no arguments are supplied, simply print the column information.