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

Menu w Pythonie - użyć OrderedDict czy zwykłej listy zawierającej instancje MenuItem?

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
89 wizyt
pytanie zadane 8 marca 2022 w Python przez doskanoness Obywatel (1,240 p.)

Witam, piszę sobie klasę do obsługi menu w konsoli:

from collections import OrderedDict


def read_int(prompt='> ', errmsg='invalid integer'):
    while True:
        try:
            return int(input(prompt))
        except ValueError:
            print(f'Error: {errmsg}')


class Menu:
    def __init__(self, title, description='', fancy_banner=True, fill_char='#', prompt='Your choice: '):
        self.title = title
        self.description = description
        self.items = OrderedDict()
        self.fancy_banner = fancy_banner
        self.fill_char = fill_char
        self.active = True
        self.prompt = prompt

    def quit(self):
        self.active = False

    def add_item(self, title, action):
        if title in self.items:
            raise ValueError(f"cannot add item, duplicate item '{self.title}'")
        self.items[title] = action

    def remove_item(self, title):
        if title not in self.items:
            raise ValueError(f"cannot remove item, item '{self.title}' not found in menu '{self.title}'")
        self.items.pop(title)

    def invoke(self, title, *args, **kwargs):
        if title not in self.items:
            raise ValueError(f"cannot invoke function, item '{self.title}' not found in menu '{self.title}'")
        self.items[title](*args, **kwargs)

    def print_banner(self):
        if self.fancy_banner:
            banner = self.fill_char * (len(self.title) + 4) + '\n'
            banner += f'# {self.title:^{len(self.title)}s} #\n'
            banner += self.fill_char * (len(self.title) + 4) + '\n'
        else:
            banner = self.title + '\n'
        return banner

    def loop(self):
        while self.active:
            for offset, item in enumerate(self.items):
                print(f'{offset}) {item}\n')
                try:
                    choice = int(input(self.prompt))
                    if choice not in enumerate(self.items):
                        raise ValueError()
                except ValueError:
                    print('Error: invalid choice!')
                self.invoke(item)

    def __str__(self):
        return self.title

    def __repr__(self):
        return f"Menu(title='{self.title}')"

    def __contains__(self, item):
        return item in self.items


def main():
    main_menu = Menu(title='Main menu')
    main_menu.loop()


if __name__ == '__main__':
    main()

Czy dobrze robię używając OrderedDict do przechowywania itemów czy lepiej stworzyć osobną klasę MenuItem i przechowywać w liście instancje tej klasy? Chcę mieć dostęp do elementów menu zarówno po wartościach przesunięcia jak w normalnej liscie, jak i po tytułach opcji menu.

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

Podobne pytania

0 głosów
3 odpowiedzi 879 wizyt
0 głosów
2 odpowiedzi 742 wizyt
pytanie zadane 9 kwietnia 2021 w Python przez TeaCup Obywatel (1,370 p.)
+1 głos
1 odpowiedź 395 wizyt
pytanie zadane 25 lutego 2020 w Python przez PIxEL Nowicjusz (180 p.)

93,188 zapytań

142,204 odpowiedzi

322,028 komentarzy

62,516 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2817p. - dia-Chann
  2. 2769p. - Łukasz Piwowar
  3. 2759p. - Łukasz Eckert
  4. 2704p. - Tomasz Bielak
  5. 2678p. - Łukasz Siedlecki
  6. 2666p. - rucin93
  7. 2627p. - CC PL
  8. 2485p. - Marcin Putra
  9. 2418p. - Michal Drewniak
  10. 2367p. - Adrian Wieprzkowicz
  11. 2317p. - Mikbac
  12. 2156p. - Anonim 3619784
  13. 2127p. - Michał Telesz
  14. 1733p. - rafalszastok
  15. 1628p. - Dominik Łempicki (kapitan)
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...