Wpis z mikrobloga

Pewnie trywialne pytanie ale muszę #python #programowanie

Napotykam się często na taki problem, że tworząc pętlę weryfikującą coś tam, ona musi się znaleźć w określonym miejscu kodu programu, lecz dobrze by było, żeby mogła skorzystać z linijek kodu które są po tej pętli stworzone....
nie mogę tych danych do tej konkretnej pętli przenieść wyżej przed pętle, bo to znowu za wcześnie i powoduje kolejne błędy.

Jest jakiś sposób żeby to łatwo nałatać czy to po prostu trzeba cały program przeorganizować raczej?

Mój przykład. Trzeba uzupełnić plik xlsx (określone komórki) więc chciałbym dodać jakąś weryfikację żeby nie przerabiało tych danych skoro komórka jest pusta bo to spowoduje error. Jeżeli komórka jest pusta no to user musi ją uzupełnić i napisać "y". Wtedy znowu jest sprawdzane czy jest dana wartość i tak w kółko.
Jakie określone komórki muszą być uzupełnione dowiadujemy się dużo później, bo zależy jakie opcje wybierze user. nie da się tego wyboru za bardzo przenieść wyżej...
  • 17
@ozzi91: twój przykład jest niejasny, natomiast wygląda na to, że po prostu architektura rozwiazania jest błedna.
Postaraj sie to sobie napisać jako liste krokow ktore musi wykonac program. Na logike brzmi to tak, ze w petli przed „przerabianiem danych” powinienes sprawdzic czy komorka jest pusta - jesli tak to niech user wpisze cos tam, jesli nie to rob przetwarzanie.
@ozzi91: plik excela wczytujesz cały np pandas i widzisz całe dane
Najpierw wykonujesz agregacie, szukanie nulli itp, a potem zmieniasz co gdzie trzeba i zapisujesz wersję pliku.
Co ty robisz? Wczytujesz linia po linii?
  • 0
@venomik
nie wiem czy umiem to lepiej wytłumaczyć ale się postaram.

Mam plik xlsx a w nim komórki do uzupełnienia:
B2 dla Orange, Tauron, Netia
B3 dla Orange
B4 dla Tauron i Netia
B5 dla Orange, Tauron

Pisząc "dla" mam na myśli, że jeżeli chce wygenerować wniosek do Tauron to komórka B2, B4, B5 musi być uzupełniona i analgoicznie dla reszty.

Jak jest teraz rozwiązane i jest trochę półśrodkiem:

1. Zapytaj użytkownika
@ozzi91: Nie jestem w stanie teraz zerknąć na kod bo muszę wychodzić i będę za parę godzin z powrotem, ale co powstrzymuje Ciebie przed kolejnością czynności:
- wczytujesz plik do pamięci
- pytasz użytkownika czy uzupełnił i jeśli tak, to sprawdzasz komórkę obowiązkową
- potem odczytujesz sobie dane z innych komórek i na ich podstawie generujesz opcje do wyboru dla użytkownika
Albo wciaż czegoś nie łapię :)Sorry, ale musiałem na szybko
  • 0
@venomik: w sumie to chodzi o to, że:
- wczytujesz plik do pamięci - tak jest
- pytasz użytkownika czy uzupełnił i jeśli tak, to sprawdzasz komórkę obowiązkową - tak jest
- tu leży problem. użytkownik uzupełniający plik nie musi podawać wsyztskich danych w excelu.

ale dobra, poradziłem sobie w miarę. po prostu część słownika skopiowałem wyżej, potem pomyślę o jakimś łączeniu tych dwóch słowników. narazie jest ok.
teraz walczę znowu
@ozzi91: jak zwykle zaciekawiłeś mnie tematem. Mimo że przejrzałem posty powyżej to kompletnie nic nie rozumiem - za gorąco jest i dzisiaj nie myślę zupełnie.

Chciałem poprosić abyś napisał jakieś user story.

Lubie wyjść od strony użytkownika bo to jasno definiuje jak to powinno wyglądać na końcu. Jeśli możesz to napisz jak wyobrażasz sobie idealny proces który powinien przejść użytkownik żeby wygenerować... no właśnie przede wszystkim jasno zdefiniuj co ma robić
  • 0
Ok. znowu się postaram :D Od początku patrząc - program działa, teraz chciałem go uczynić po prostu bardziej idiotoodpornym.

No to tak:
Program jest ogólnie bardzo specyficzny, myślę że nigdzie indziej oprócz mojej obecnej firmy się po prostu nie sprawdzi.

1. User na początku wybiera główny folder zadania w którym program ma zadziałać.
2. Następnie z listy opracowanych "urzędów" ma wybrać do kogo chce skierować wniosek
3. Na podstawie tego co wybierze
nie chcę wpisywać danych przez program, wolałbym dostać po prostu monit że coś jest nie tak, otwieram plik xlsx w excelu, wpisuję co mam wpisać,


@ozzi91: czyli jeśli dobrze rozumiem mógł by być drugi program / podprogram którego zadaniem była by tylko walidacja arkusza?

Jeśli chodzi o walidacje to przyjąłbym inną metodę.
Tworzyłbym listę której elementy były by błędami jakie znalazł twój program. Jeśli lista była by pusta to uznałbym że
Nie byłbym sobą, gdybym nie zrobił tego bardziej idiotoodpornego


@ozzi91: No użytkownikom trzeba ułatwiać co się da. Więc jeśli jest opcja żeby user wybrał coś z jakiejś listy to dobrze jest takie ułatwienia wprowadzać. Łatwiej wybrać lub zaznaczyć jakąś jedna opcję z wielu niż wpisywać.

Tak myślę że walidacja w twoim przypadku powinna przebiegać niezależnie i po całym pliku, Nawet po tych fragmentach które generuje program. Niezależność przysporzy trochę pracy ale
  • 0
@mrq: nie no program czy podprogram do weryfikacji -> za dużo powiedziane :D To co napisałeś wyżej, o zbieraniu błędów z programu - zielonego pojęcia nie mam jak się za to zabrać - chyba jeszcze za wcześnie.

for cell in TEMPLATES[user_choice]['needed_cells']:
if cell.value is None or cell.value == "":

W template dodałem osobno klucz neededcells który zawiera listę potrzebnych wypełnionych komórek, żeby właśnie potem zależnie od wyboru można było to
Czyli jeżeli dobrze rozumiem, taki zapis nie wczytuje ponownie wartości tych komórek?


@ozzi91: To zależy i teraz to sam nie wiem. Można to sprawdzić :) dodaj print(cell.value) przed tym if'em z warunkiem :) zobaczysz co ci wypisze. Ale chyba problem leży gdzie indziej.

Logikę ogólnie masz dobrą tylko zmylił mnie fakt że to jest w TEMPLATE. To ma nawet sens jeśli w tej stałej jest tylko adres komórki która trzeba sprawdzić.
@ozzi91:
A czy rozwiązaniem Twojego problemu nie będzie kod w stylu tym:
https://pastebin.com/dmDJyEMq
Generalnie poza pętle while wyrzucasz do metod wszystko, co będzie odpowiedzialne za:
- sprawdzenie czy użytkownik uzupełnił wszystko
- sprawdzenie co użytkownik powinien uzupełnić (tego w sumie nie ma w wklejonym pseudokodzie, tam masz komentarz)
Bo nie wiem czy przypadkiem teraz Twoim problemem nie jest fakt że bazujesz na pliku wczytanym do pamięci, który użytkownik w międzyczasie otwiera
via Android
  • 0
@mrq hmm, masz rację. będę musiał sprawdzić Twoje podejście bo nawet "zdrowiej" kod wygląda w tym przypadku.

na 100% moim błędem jest to że, kod wygląda mniej więcej tak: odczytaj dane z komórki i zapisz w zmiennej x. potem ta zmienna x wędruje w dalszej części kodu jako wartość klucza w templates żeby niejako mieć wizualnie przedstawione WSZYTSKIE klucze i wartości skojarzone z danym templatem jednakże instynkt podpowiada mi, że bardziej profesjonalnie
dodawać konkretne pary funkcja niż takie przypisywanie


@ozzi91: Powiem ci jak jeszcze w konkretnych pytaniach czy fragmentach kodu idzie coś ogarnąć w rozmowie przez mikrobloga tak już każdy bardziej ogólny wątek to jest taki poziom abstrakcji że ciężko zrozumieć o czym rozmawiamy. Masz może do tego jakiś diagram UML? ;)
@ozzi91: ja i pewnie wszyscy którzy od kilku tygodni śledzą ten wątek (nawet jeśli nie zabierają głosu) chętnie by rzucili okiem na cały kod :) Choć nie daje gwarancji czy uda się coś ugrać z mojej strony. W każdym razie porozmawiać zawsze warto. Może się nauczę czegoś nowego.

Co do danych wrażliwych to powinieneś pracować na jakiś mockupach danych - identycznych w strukturze i zawierających sens ale nieprawdziwych i udostępniać kod