• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Python - proszę kogokolwiek w miarę możliwości o przejrzenie kodu, coś nie działa poprawnie

Object Storage Arubacloud
0 głosów
539 wizyt
pytanie zadane 20 sierpnia 2021 w Python przez thesolitaryofchoice Początkujący (490 p.)

https://pastebin.com/u/matisarnowski/1/iVCAdBfV

Witam, uprzejmie proszę o pomoc. Tak to już chyba jest, że jak długo się siedzi tylko samemu przed kodem, to nie można potem znależć, co nie gra. W klasie Language.py coś mi nie gra w metodzie set_language_name. Tak podejrzewam. Mianowicie chodzi, o to, że wyrzuca nie ten słownik, co trzeba. Podejrzewam, że nie mam gdzieś właściwego przypisania. Ale już naprawdę dostaje oczopląsu od oglądania tego. Nie stać mnie na profesjonalnego PyCharma, używam do debugowania VSC. Działam na LInuksie, więc może trzeba będzie przy uruchomieniu(jeśli ktoś nie da sobie spokoju wcześniej) zmienić adres ścieżki. Chodzi mi o ukośniki. Ogółem mam taki zamysł, że chciałbym stworzyć dwa słowniki. Jeden z nazwą języka programowania i ilością wystąpień tego języka w input() konsolowym, a drugi z wymaganiami do każdego z tych języków wprowadzanymi póki, co tą samą metodą. Ostatecznie chciałbym to wsyzstko jakoś podłączyć do mądrze napisanego Scrapera, ale ostatnio mam już coraz większe wątpliwości, czy mi takie rzeczy będą wychodzić. Pozdrawiam i z góry dziękuję za pomoc.

Mateusz

#!/usr/bin/python3
from Language import Language
from Requirement import Requirement

def main():
    languages = Language()
    requirements = Requirement(languages.language_dict)
    while True:
        language_name = languages.set_language_name()
        language_dict = languages.write_dict_language()
        while(True):
            requirements.set_requirement_name(language_name, language_dict)         
            requirements.write_requirements_name()
            print('Czy chcesz wyjść? T/N')
            if input() == 'T':
                break
            elif input() == 'N':
                continue
            else:
                print('Coś poszło nie tak. ')
        print('Czy chcesz wyjść? T/N')
        if input() == 'T':
            break
        elif input() == 'N':
            continue
        else:
            print('Coś poszło nie tak. ')
   
if __name__ == '__main__':
    main()

import os
from pathlib import Path
from ast import literal_eval

class Language():
    
    def __init__(self):
        self.language_name = ""
        self.language_dict = self.read_dict_language()
    
    def set_language_name(self):
        self.language_name = input("Podaj nazwę języka programowania, co do którego przeglądasz ofertę pracy: ")
        
        if self.language_name in self.language_dict.keys() and len(self.language_name) != 0:
            self.language_dict[self.language_name] += 1
            return self.language_name
        elif self.language_name not in self.language_dict.keys() and len(self.language_name) != 0:
            self.language_dict[self.language_name] = 1
            return self.language_name
        else:
            print('Nazwa języka nie może być pusta. \n')
            self.set_language_name()
    
    def read_dict_language(self):
        with open('/home/mateusz/Dokumenty/Dokumenty/informatyka/Python/python_code/projekty_cwiczeniowe-master/RozmowaKwalifikacyjna/dictLanguage.txt') as file:
            if Path('/home/mateusz/Dokumenty/Dokumenty/informatyka/Python/python_code/projekty_cwiczeniowe-master/RozmowaKwalifikacyjna/dictLanguage.txt').stat().st_size == 0:
                self.language_dict = dict()
                return self.language_dict
            else:
                self.language_dict = eval(file.read())
                return self.language_dict
        
    def write_dict_language(self):
        with open('/home/mateusz/Dokumenty/Dokumenty/informatyka/Python/python_code/projekty_cwiczeniowe-master/RozmowaKwalifikacyjna/dictLanguage.txt', 'w') as file:
            file.write(str(self.language_dict))
            return self.language_dict
       
from Language import Language 
from pathlib import Path
from ast import literal_eval

class Requirement(Language):
    def __init__(self, language_dict):
        self.language_name = ""
        self.requirements_name = language_dict
        self.requirement_name = ""
        self.dict_requirement = self.read_requirement_dict()
        
    def set_requirement_name(self, language_name, language_dict):
        if self.requirement_name != {}:
            self.requirement_name = language_dict
        
        print("Podaj nazwę wymagania dla języka programowania: ", language_name)
        self.requirement_name = input()
        self.set_dict_requirement(self.requirement_name)
        
        if language_name in self.requirement_name:    
            self.requirements_name[language_name] = self.dict_requirement
        else:
            self.set_dict_requirement(self.requirement_name)
                
    def read_requirement_dict(self):
        with open('/home/mateusz/Dokumenty/Dokumenty/informatyka/Python/python_code/projekty_cwiczeniowe-master/RozmowaKwalifikacyjna/dictRequirement.txt') as file:
            if Path('/home/mateusz/Dokumenty/Dokumenty/informatyka/Python/python_code/projekty_cwiczeniowe-master/RozmowaKwalifikacyjna/dictRequirement.txt').stat().st_size == 0:
                self.dict_requirement = dict()
                return self.dict_requirement
            else:
                self.dict_requirement = eval(file.read())
                return self.dict_requirement
        
    
    def set_dict_requirement(self, requirement_name):
        if  requirement_name in self.dict_requirement.keys() and len(requirement_name) != 0:
            self.dict_requirement[requirement_name] += 1
            return self.dict_requirement
        elif requirement_name not in self.dict_requirement.keys() and len(requirement_name) != 0:
            self.dict_requirement[requirement_name] = 1
            return self.dict_requirement
        else:
            print('Nazwa języka nie może być pusta')
            self.set_requirement_name() 
               
    def write_requirements_name(self):
        with open('/home/mateusz/Dokumenty/Dokumenty/informatyka/Python/python_code/projekty_cwiczeniowe-master/RozmowaKwalifikacyjna/dictRequirement.txt', 'w') as file:
            file.write(str(self.requirements_name))

 

komentarz 20 sierpnia 2021 przez adrian17 Ekspert (344,860 p.)

Uhh... mocny miszmasz w tym kodzie.

class Requirement(Language):
    def __init__(self, language_dict):
        self.language_name = ""
        self.requirements_name = language_dict
        self.requirement_name = ""
        self.dict_requirement = self.read_requirement_dict()

Czemu wymaganie jest językiem? Używasz dziedziczenia, ale ono tutaj za bardzo nie ma sensu.

Czemu te wszystkie rzeczy są polami klasy, a nie zwykłymi zmiennymi (na przykład requirement_name). TBH nawet nie jestem za bardzo w stanie zrozumieć, co chcesz mieć w tym pliku końcowym z wymaganiami. Czym się różni dict_requirement od requirements_name?

if language_name in self.requirement_name:

Czemu nazwa języka miała by być w nazwie wymagania?

self.language_dict = eval(file.read())

...poczytaj o JSONie.

            if input() == 'T':
                break
            elif input() == 'N':
                continue

To też raczej poprawnie nie działa w przypadku 'N' :)

komentarz 20 sierpnia 2021 przez thesolitaryofchoice Początkujący (490 p.)
Ogółem nazwy rzeczywiście mogą być mylące. Langauge_name to miał być słownik taki jak {python:2, java:3} requirement_dict, to miał być z założenia słownik w słowniku, czyli np. {data science:2} lub {rest api:2} a requirement_name miał być wyjściowym słownikiem np. {python:{data science:2}, java:{rest api:2}}. Przepraszam za zamieszanie. Co do json, to wiem, o tym, że istnieje łatwa możliwość konwersji między słownikiem, a tym formatem. Ale póki, co chciałem na razie stworzyć takie słowniki. Wyszło słabo.
komentarz 21 sierpnia 2021 przez Whistleroosh Maniak (56,980 p.)

Nawiąże do tego, co powiedział @adrian17. Czy w tym fragmencie:

if language_name in self.requirement_name:    
    self.requirements_name[language_name] = self.dict_requirement
else:
    self.set_dict_requirement(self.requirement_name)

nie mylisz requirements_name z requirement_name?

Dodatkowo masz metodę read_requirement_dict, która pobiera z pliku dicta do dict_requirement, ale w metodzie write_requirements_name otwierasz ten sam plik, a wypisujesz zawartość requirements_name. Tak ma być, czy czegoś nie rozumiem?

komentarz 21 sierpnia 2021 przez thesolitaryofchoice Początkujący (490 p.)

Witam dziękuję wszystkim za okazane zainteresowanie. Niestety muszę na razie spadać. Pracuję na zmiany i nie mam czasu na częste zmiany w kodzie, który napisałem. Odezwę się za jakiś czas. Jak przetrawię, to co mi napisaliście i co znalazłem między innymi, tu: https://stackoverflow.com/questions/25877645/edit-dictionary-in-python

komentarz 22 sierpnia 2021 przez overcq Pasjonat (21,650 p.)

Wydaje się, że w tych klasach są pomieszane dwa podejścia do rozwiązania problemu:

  • albo klasy Language i Requirements odpowiadają za słowniki
  • albo klasa Language przechowuje klasy Requirements dla każdego języka

Poza tym przechowujesz wartości lokalne z rozwiązania pierwszego w zmiennych klasy z rozwiązania drugiego.

Jeśli chodzi o rozwiązanie pierwsze, to zoptymalizowałbym to w ten sposób:

import json
import os
from pathlib import Path

class Language():
    path = 'dictLanguage.txt'
    def __init__(self):
        self.language_dict = self.read_dict_language()

    def set_language_name(self):
        while True:
            language_name = input("Podaj nazwę języka programowania, co do którego przeglądasz ofertę pracy: ")
            if len(language_name) != 0:
                if language_name in self.language_dict.keys():
                    self.language_dict[language_name] += 1
                else:
                    self.language_dict[language_name] = 1
                return language_name
            print('Nazwa języka nie może być pusta. \n')

    def read_dict_language(self):
        with open(self.path) as file:
            if Path(self.path).stat().st_size == 0:
                return dict()
            return json.loads(file.read())

    def write_dict_language(self):
        with open(self.path, 'w') as file:
            file.write(json.dumps(self.language_dict))
            return self.language_dict

import json
from Language import Language 
from pathlib import Path

class Requirement():
    path = 'dictRequirement.txt'
    def __init__(self, language_dict):
        self.language_dict = language_dict
        self.dict_requirement = self.read_requirement_dict()

    def set_requirement_name(self, language_name):
        print("Podaj nazwę wymagania dla języka programowania: ", language_name)
        requirement_name = input()
        self.set_dict_requirement(language_name, requirement_name)

    def read_requirement_dict(self):
        with open(self.path) as file:
            if Path(self.path).stat().st_size == 0:
                return dict()
            return json.loads(file.read())

    def set_dict_requirement(self, language_name, requirement_name):
        while True:
            if len(requirement_name) != 0:
                if language_name not in self.dict_requirement.keys():
                    self.dict_requirement[language_name] = dict()
                if requirement_name in self.dict_requirement[language_name].keys():
                    self.dict_requirement[language_name][requirement_name] += 1
                else:
                    self.dict_requirement[language_name][requirement_name] = 1
                return self.dict_requirement
            print('Nazwa wymagania nie może być pusta')

    def write_requirements_name(self):
        with open(self.path, 'w') as file:
            file.write(json.dumps(self.dict_requirement))

#!/usr/bin/python3
from Language import Language
from Requirement import Requirement

def main():
    languages = Language()
    requirements = Requirement(languages.language_dict)
    while True:
        language_name = languages.set_language_name()
        languages.write_dict_language()
        while True:
            requirements.set_requirement_name(language_name)
            requirements.write_requirements_name()
            print('Czy chcesz wyjść? T/N')
            c = input()
            if c == 'T' or c == 't':
                break
            elif c == 'N' or c == 'n':
                continue
            else:
                print('Coś poszło nie tak.')
        print('Czy chcesz wyjść? T/N')
        c = input()
        if c == 'T' or c == 't':
            break
        elif c == 'N' or c == 'n':
            continue
        else:
            print('Coś poszło nie tak.')

if __name__ == '__main__':
    main()

Natomiast przypuszczam, że chciałeś wykorzystać rozwiązanie drugie.

komentarz 26 sierpnia 2021 przez thesolitaryofchoice Początkujący (490 p.)
Dzięki to działa. Dokładnie, o to mi chodziło. Myślałem, że może łatwiej będzie komputerowi działać na jakiejś strukturze danych i ją zapisywać do pliku. Ale potem zastanowiłem się, że przecież i tak musi wszystko zapisać do pliku i tak. A więc rzeczywiście skorzystanie z json jest najrozsądniejsze. Dodałem tylko taką głupotkę

requirement_name = requirement_name.lower()

i

language_name = language_name.lower()

Myślę, że to jeszcze mi uprości sprawę.

Niestety u mnie ścieżka ma bardzo dużo podkatalogów i chyba przez to nie mogę nawet, gdy cwd jest tym, w którym znajduje się skrypt otworzyć plików json. A i jeszcze zmieniłem sobie już format na .JSON. Bo widzę, że zostawiłeś .txt. Choć to chyba nie ma dużego znaczenia. Nie wiem.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
3 odpowiedzi 9,450 wizyt
pytanie zadane 26 stycznia 2017 w Python przez ASAP(education) Nowicjusz (200 p.)
0 głosów
2 odpowiedzi 586 wizyt
pytanie zadane 26 stycznia 2017 w Rozwój zawodowy, nauka, praca przez ASAP(education) Nowicjusz (200 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...