#coding: utf-8

# Robione na szybko - z minimalną ilością komentarzy.
# Brak  "idioto-odporności".

class Ttable:
  '''Obsługa tabel 2 wymiarowych.'''
  _DATA=[]				# Lista najwszego popziomu.
  _X=-1                                 # Wymiar poziomy - nie jest ustawiony.
  _Y=-1                                 # Wymiar pionowy - nie jest ustawiony.

#------------------------------------ INIT -------------------------------------------
#---============================[ __init__ ]==========================================[]
  def __init__(self,X,Y=None):
    '''Inicjacja wymiarami XxY lub X[0]xX[1].'''
    if Y!=None:
      self._Y=Y
      self._X=X
    elif type(X)==tuple:
      (self.X,self.Y)=X
    else:
      raise Exception(f'Błędna inicjcja ({X},{Y})!')
    self._makeTable()

#------------------------------------ ACCESS -------------------------------------------
#---============================[ __getitem__ ]==========================================[]
  def __getitem__(self,P):
    ''' Dla T=Ttable     T[x,y] - zwraca y-ty wiersz i x-ty element wiersza'''
    (x,y)=P									# Rozkłada parę współrzędnch na oddzielne współrzędne.
    if x>=self._X:
      raise Exception(f'Współrzędna x jest za duża {x} powinna być mniejsza od {self._X}!')
    if y>=self._Y:
      raise Exception(f'Współrzędna y jest za duża {y} powinna być mniejsza od {self._Y}!')
    return self._DATA[y][x]

#---============================[ __setitem__ ]==========================================[]
  def __setitem__(self,P,V):
    '''Do pola T[P=(x,y)] wstawia wargtość V.'''
    (x,y)=P									# Rozkłada parę współrzędnch na oddzielne współrzędne.
    if x>=self._X:
      raise Exception(f'Współrzędna x jest za duża {x} powinna być mniejsza od {self._X}!')
    if y>=self._Y:
      raise Exception(f'Współrzędna y jest za duża {y} powinna być mniejsza od {self._Y}!')
    self._DATA[y][x]=V

  def _makeTable(self):
    '''Tworzy pustą tablicę XxY.'''
    self._DATA=[[None for x in range(self._X)] for y in range(self._Y)]

#------------------------------------ SHOW -------------------------------------------
#---============================[ __str__ ]==========================================[]
  def __str__(self):
    return '\n'.join([','.join([f'{v}' for v in self._DATA[y]]) for y in range(self._Y)])

    RES=[]
    for y in range(self._Y):
      RES+=[','.join(self._DATA[y])]

    return '\n'.join(RES)


#---============================[ __name__ ]==========================================[]
if __name__=='__main__':
  T=Ttable(3,5)
  T[(2,2)]='Ala'
  print(T)
  print('-'*40)
  print(str(T))



