Piszę taki programik dla siebie, w ramach rozrywki i nauki. Ma to liczyć pola figur. Zasadniczo proste, jeśli pola są zdefiniowane odgórnie, np.:
def trojkat(a, h):
pole = 0.5 * a * h
return pole
oblicz_trojkat = trojkat(5, 7)
Jednak ma to tę wadę, że figur jest mnóstwo a każda z nich może mieć wiele wzorów. To oznacza dziesiątki defów w kodzie. Ale to jeszcze nie jest najgorsze. Chciałbym, aby mój program się uczył - jeśli ktoś zna inny wzór, to może go podać. Tę część akurat mam już opanowaną - napisałem skrypt, który pyta użytkownika o nowy wzór, pobiera od niego parametry, jak kąt czy długości podstaw oraz wzór a następnie zapisuje to w słowniku, który na końcu zrzucany jest do jsona, który to z kolei otwiera się przy starcie, więc po następnym użyciu program ma już więcej wzorów.
Teoretycznie powinno być prościej - zamiast zyliarda definicji mam tylko jedną, która pobiera odpowiednie dane ze słownika, prosi użytkownika o podanie ich wartości a następnie liczy ze wzoru, który też jest w słowniku.
Przykładowy słownik wygląda tak, są tu tylko trzy przykładowe pola na trójkąt, resztę dopiszę, jak to zacznie działać:
slownik_z_polami = {'trojkat': [[['a', 'h'], ['0.5*a*h']], [['a', 'b', 'g'], ['0.5*a*b*sin(g)']], [['a', 'b', 'c', 'r'], ['0.5*r*(a+b+c)']]]}
Na czym polega mój problem?
Oczywiście, operując na słownikach i listach mogę pobrać z tego słownika dowolną wartość - wzór czy ilość parametrów. Mogę to wysłać do jednej zbiorczej funkcji, która to przemieli, zapyta użytkownika o wartości i wypluje dane. Tylko to są cały czas stringi. Jak sprawić, by to były liczby???
Np. wzór 0.5ah - zamiana przez int() nie ma sensu, bo program krzyczy, że nie ma takich zmiennych jak a i h.
Z kolei np. podstawa:
pobierz_dane1 = slownik_z_polami['trojkat'][0][0][0]
to tez string i choćby nie wiem co, nie zamienię go na int. Nawet jeśli wstępnie utworzę pobierz_dane_1 = 1 (czego wolałbym uniknąć, bo te dane numerowane mają być przydzielane dynamicznie w zależności od tego, ile ich jest, a tego przecież nie wiem - może ktoś podać wzór z dużą ilością parametrów, to nie będę na wszelki wypadek definiował 50ciu zmiennych), to po pobraniu ze słownika typ i tak się zmieni na str.
Jak to ugryźć???
Edit: hm, w podglądzie nie brakuje kwadratowego nawiasu po trójkącie, są też wcięcia, nie wiem, jak to tu prawidłowo wkleić, ale to dla idei nie ma chyba znaczenia.
Edit2: Może napiszę dla jasności, jak to powinno wg mnie działać. Już bez kodu - kod napisałem, ale nie działa, bo to stringi.
No więc widzę to tak:
def funkcja_liczenia_pola(jeden_parametr)
'''w trakcie rozmowy z programem wybiera się, jak się chce liczyć pole - np. z boków i sinusa kąta, to wystarczy, by określić ten jeden parametr, wg którego funkcja pobierze odpowiednie dane'''
- funkcja - wg tego jeden_parametr - pobiera z listy trzy wartości, a, b i g i prosi użytkownika o ich wartości.
i już tu jest problem, choć np.slownik_z_polami['trojkat'][1][0][0]
ma wartość 'a', to jest to string, nie przypiszę mu przez input żadnej wartości - teraz funkcja pobiera wzór ze słownika i - mając podane przez użytkownika dane - oblicza pole i podaje wynik
i tu jest analogiczny problem - wzór to string i nie wiem jak sprawić, żeby python traktował go jak wzór