Okazało się, że moje założenia dotyczące konieczności przeprowadzenia rollback'a, były niepotrzebne. Testowałem różne możliwe rozwiązania i nie podobało mi się, że spora część mojej pracy zostanie zmarnowana, przez to, że nie uwzględniłem przekazywania atrybutów w Tkinter.
Wygrało najprostsze rozwiązanie - tworzenie referencji.
Zastosowałem również najprostszą opcję, czyli użycie listy. Nie sprawdziłem, czy dało by radę zrobić to ze słownikiem. Aczkolwiek ze względu na zastosowanie słowników w przekazywaniu wielu elementów jako key word arguments w "**kwargs" nie sądzę, aby to było możliwe. Nie natrafiłem również na żadną wzmiankę poruszającą ten temat.
Jedyny mankament związany z wykorzystaniem list w Tkinter jest bug związany z kopiowaniem listy. Trafiłem na niego pisząc prostą grę typu "snake" wykorzystując właśnie Tkinter. Uznałem to za pewnego rodzaju eksperyment i jednocześnie wyzwanie, gdyż gdzieś na "stacku" przeczytałem, że się nie da. Efektem ubocznym tego projektu, było znalezienie bug'a związanego z kopiowaniem listy.
Otóż, w Python jeśli kopiuje się listę nazwaną "a" do listy o nazwie "b" nie wystarczy postawić zwykłego znaku równości:
a = [1, 2, 3, 4, 5]
b = a
Kod ten nie spowoduje utworzenia kopii listy "a", zmienna "b" będzie jedynie wskazywała (będzie referencją) do miejsca w pamięci gdzie znajduje się lista "a". Aby skopiować listę, trzeba użyć:
b = a[:]
Spowoduje to utworzenie w pamięci kopii listy "a" i przypisanie jej do zmiennej "b". Błąd, który znalazłem powodował, że ten mechanizm nie działał poprawnie. Do przeprowadzenia kopiowania listy było konieczne użycie modułu "deepcopy".
Brak komentarzy:
Prześlij komentarz