Wielka księga małych projektów w Pythonie. 81 łatwych praktycznych programów. Al Sweigart

0

Witam. Jestem w trakcie nauki pythona. W książce "Wielka księga małych projektów w Pythonie. 81 łatwych praktycznych programów" autor Al Sweigart stosuje często camelCase. Zawsze spotykałem się wcześniej, że w Python powinno stosować się snake_case, prócz kilku wyjątków jak np. nazwy klas. Czy książka nie uczy złych nawyków pisania kodu w Python?
O to przykładowy pierwszy kod z książki:

import random

NUM_DIGITS = 3  # (!) Spróbuj ustawić tę stałą na 1 lub 10.
MAX_GUESSES = 10  # (!) Spróbuj ustawić tę stałą na 1 lub 100.


def main():
    print('''Bajgle, logiczna gra na dedukcję.
Autor: Al Sweigart, [email protected]

Mam na myśli {}-cyfrową liczbę, która nie powtarza się żadna z cyfr. Spróbuj ją odgadnąć.
Oto wskazówki:
Gdy mówię:    Oznacza to:
  Piko         Jedna cyfra jest poprawna, ale jest na złej pozycji.
  Fermi        Jedna cyfra jest poprawna i znajduje się w odpowiednim miejscu.
  Bajgle       Żadna cyfra nie jest poprawna.

Na przykład, jeśli tajna liczba to 248, a Ty podasz liczbę 843, wskazówka będzie brzmieć
Fermi Piko.'''.format(NUM_DIGITS))

    while True:  # Pętla główna.
        # Ta zmienna przechowuje liczbę, którą gracz musi odgadnąć:
        secretNum = getSecretNum()
        print('Mam na myśli liczbę.')
        print(' Masz {} prób, by odgadnąć, jaka to liczba.'.format(MAX_GUESSES))

        numGuesses = 1
        while numGuesses <= MAX_GUESSES:
            guess = ''
            # Wykonywanie pętli, dopóki gracz nie poda poprawnej liczby:
            while len(guess) != NUM_DIGITS or not guess.isdecimal():
                print('Próba #{}: '.format(numGuesses))
                guess = input('> ')

            clues = getClues(guess, secretNum)
            print(clues)
            numGuesses += 1

            if guess == secretNum:
                break  # Podana liczba jest poprawna, zakończ pętlę.
            if numGuesses > MAX_GUESSES:
                print('Wykorzystałeś wszystkie próby.')
                print('Prawidłowa odpowiedź to: {}.'.format(secretNum))

        # Zapytaj gracza, czy chce zagrać ponownie.
        print('Czy chcesz zagrać jeszcze raz? (tak lub nie)')
        if not input('> ').lower().startswith('t'):
            break
    print('Dziękuję za grę!')


def getSecretNum():
    """Zwraca liczbę złożoną z tylu losowych, unikatowych cyfr, ile wynosi wartość NUM_DIGITS."""
    numbers = list('0123456789')  # Utwórz listę cyfr od 0 do 9.
    random.shuffle(numbers)  # Ustaw je w losowej kolejności.

    # Dodaj kolejne cyfry do tajemnej liczby:
    secretNum = ''
    for i in range(NUM_DIGITS):
        secretNum += str(numbers[i])
    return secretNum


def getClues(guess, secretNum):
    """Zwraca łańcuch znaków piko, fermi, bajgle dla danej próby
    lub informację o wygranej."""
    if guess == secretNum:
        return 'Udało się!'

    clues = []

    for i in range(len(guess)):
        if guess[i] == secretNum[i]:
            # Poprawna cyfra w odpowiednim miejscu.
            clues.append('Fermi')
        elif guess[i] in secretNum:
            # Poprawna cyfra w złym miejscu.
            clues.append('Piko')
    if len(clues) == 0:
        return 'Bajgle'  # Brak poprawnych cyfr.
    else:
        # Ustaw wskazówki w kolejności alfabetycznej,
        # by ich kolejność nie zdradzała zbyt wiele informacji.
        clues.sort()
        # Wszystkie wskazówki połącz w jeden łańcuch znaków.
        return ' '.join(clues)


# Jeśli program został uruchomiony (a nie zaimportowany), uruchom grę:
if __name__ == '__main__':
    main()
1

Zgadzam się raczej stosuje sie snake_case, PEP8 jest standardem.

Ze swojej strony mogę polecić Pylint, zwłaszcza jako plugin do edytora. Podpowie i wykryje wiele błędów, kiepskiej jakości kodu. Z czasem to jakos później idze auotmatycznie, chociaż przyznam się bez niego to juz nie był bym już taki staranny.

1

Z drugiej strony kłania się PyQt, bo też się wyłamuje :]

Przykładowy fragment kodu:

self.charCountEdit = QSpinBox()
self.charCountEdit.setSingleStep(1)
self.charCountEdit.setValue(4)

self.outputArea = QPlainTextEdit()
self.outputArea.setFixedHeight(550)
self.outputArea.setFixedWidth(300)

Osobiście nie przepadam za snake case - wygląda tak jakoś retro...
Ale jeśli dołączysz do projektu, w którym się go stosuje, to nie powinieneś z tym walczyć.
Ważne, żeby trzymać się jednego standardu w danym projekcie.

Bindingi Qt dla Pythona wyglądają jak wyglądają, bo można też używać Qt w języku C++.
I lepiej gdy w obydwu językach metody nazywają się tak samo.

1

Zawsze miałem poczucie, że python jest trochę "partyzanckim" językiem, tzn bardziej do doraźnych projektów niż poważnych zastosowań więc po prostu stosowałbym taki case jaki Ci pasuje najbardziej, a przy pracy w zespole taki jak stosuje zespół. W bibliotekach do pythona do których patrzyłem widziałem tylko snake case, w tutorialach często camel case.

0

Pisze się snake_case i camelCase. Ewentualnie pisze_czytelnie i ciezkoToCzytac.

1 użytkowników online, w tym zalogowanych: 0, gości: 1