TL;DR: Pierwsze czyszczenie kodu. A może przynajmniej trochę bardziej intuicyjne nazewnictwo. Mamy całą listę zasad co to wyglądu kodu, którą najpewniej powinno się całą przeanalizować i stosować. My jednak zaczniemy starym zwyczajem od postaw.

Dobrze wiedzieć, że dobre IDE zrobi większość roboty za ciebie. Zamiast studiować księgi PEB 8, taki PyCharm, którego polecam, podkreśli co mu się nie będzie podobać i podpowie jakby to widział. To pierwszy krok do przejrzystego kodu.

Jednak pojawia się pytanie. Jakie nazwy stosować? Jakie są zasady nazewnictwa zmiennych czy klas? Oto podstawy podstaw:

  1.  Nie używamy nazewnictwa jednoliterowego typu I lub l albo 1, O czy 0 czyli bardzo podobnych do siebie znaków, które będą w niektórych czcionkach wręcz nieodróżnialne.
  2. Nazwy pakietów i modułów powinny być krótkie i jednowyrazowe
  3. Nazwy klas powinny być w konwencji CapWords
  4. Nazwy funkcji piszemy małymi literami ewentualnie dodajemy podkreślenie czyli nazwa lub nazwa_funkcji
  5. Nazwy zmiennych piszemy na tej samej zasadzie co funkcje

Lepiej sensownie niż krótko

Ważne jest również żeby nazwy możliwie jak najbardziej odzwierciedlały swoje użycie. Szczerze mówiąc sprawia mi to nieco problemów, żeby na poczekaniu wynaleźć dobrą, krótką nazwę zawierającą sens danej funkcji czy zmiennej, ale widzę, że warto pogłówkować, bo potem o wiele łatwiej po czasie ogarnąć to co się napisało.

Czasem poprawki nie są drastyczne, ale mocno zmieniają czytelność na plus. Dajmy na to:

bttn = []
numbers="HMS789456123C0:"
i = 0
for j in range(1,6):
    for k in range(3):
        bttn.append(Button(rightFrame, text = numbers[i], font ="Helvetica 15 bold", height = 1, width = 2))
        bttn[i].grid(row = j, column = k, pady = 2, padx = 2)
        bttn[i]["command"] = lambda x = numbers[i]: num_press(x)
        i += 1

a to:


keyboard = []
keys = "HMS789456123C0:"
i = 0
for j in range(1, 6):
    for k in range(3):
        keyboard.append(Button(rightFrame, text=keys[i], font="Helvetica 15 bold", height=1, width=2))
        keyboard[i].grid(row=j, column=k, pady=2, padx=2)
        keyboard[i]["command"] = lambda x=keys[i]: num_press(x)
        i += 1

Niby można domyślić się, że bttn to skrót od button a numbers to numery na tych przyciskach, ale po co utrudniać i komplikować. Nazwy nie muszą być oryginalne, mają być sensowne i czytelne.

Wcześniej miałem coś takiego jak listone oraz sb1 czyli listbox pierwszy i scrollbar do niego. Już lepiej, żeby nazwy były dłuższe, ale czytelniejsze entries_list oraz entries_list_scrollbar.

Więcej informacji

Dobrze też ułatwić czytanie kodu przez wprowadzenie w nazwie nieco więcej informacji. Zamiast status mam teraz bottom_status_total dzięki czemu wiem, że dotyczy to statusu na dole okna, który sumuje wszystkie wprowadzone dane przez użytkownika.

To nie jest żmudne

Zmiana nazw z dobrym IDE nie jest ani trudna, ani problematyczna. Nie próbuj czasami zmieniać nazw ręcznie, bo więcej niż pewne, że zapomnisz tego zrobić w którejś linice i cały kod się wysypie.

W PyCharm wystarczy, że klikniesz w nazwę, którą chcesz zmienić, żeby ją zaznaczyć, klikasz prawym przyciskiem myszy, Refactor, Rename i magicznie zmiany są wprowadzone jednocześnie we wszystkich miejscach w których jest odwołanie to tej funkcji, zmiennej czy klasy.

Tak wygląda kod po pierwszych poprawkach. Sensowniej? Przynajmniej jest już czytelniejszy dla innych.

Masz jakieś rady lub uwagi? Daj znać w komentarzu. Newbie here.


from tkinter import *

entries = []
total_info = ""

def add_entry(evt):  # For calculation button
    global total_info, entries
    entry = top_frame_input.get()
    entry = entry.replace("+", "")

    try:
        int(entry)
        # entries_list.insert(0,entry)
        entries.append(int(entry))
        total_info = "Total: " + str(sum(entries))
        status.set(total_info)
        entries_update()
        top_frame_input.delete(0, END)

    except:
        top_frame_input.focus()

def clear_all(evt):  # clear top_frame_input
    top_frame_input.delete(0, END)
    top_frame_input.focus()

def clear_one(evt):  # clear last digit from top_frame_input
    entry = top_frame_input.get()[:-1]
    top_frame_input.delete(0, END)
    top_frame_input.insert(0, entry)

def num_press(num):  # num pad button action
    if num == "C":
        clear_all("C")
    elif num == ",":  # yeah, I found it quite useful for my keyboard
        top_frame_input.insert(END, ".")
    else:

        top_frame_input.insert(END, num)
        top_frame_input.focus()

def entries_update():
    entries_list.delete(0, END)
    for ti in entries:
        entries_list.insert(0, ti)

# =======tkinter window===========
win = Tk()
# win.geometry("775x325") # Force window size
win.wm_title("Tacho 0.0.2")
win.resizable(width=FALSE, height=FALSE)

topFrame = Frame(win)
# topFrame.pack(fill=BOTH)
topFrame.grid(row=0, column=0, columnspan=2)

rightFrame = Frame(win)
rightFrame.grid(row=1, column=1)

leftFrame = Frame(win)
# middleFrame.pack(fill=BOTH)
leftFrame.grid(row=1, column=0)

bottomFrame = Frame(win)
bottomFrame.grid(row=2, columnspan=2)

# -------keys actions-----
win.bind("<Return>", add_entry)
win.bind("<KP_Enter>", add_entry)
win.bind("<KP_Add>", add_entry)

# ==========input entry===========
top_frame_input = Entry(topFrame, textvariable=StringVar(),
                        font="Helvetica 20 bold", width=18, justify=RIGHT)
top_frame_input.grid(column=8)
# top_frame_input.pack(fill=X, expand=True, side=RIGHT, ipady=10)
top_frame_input.bind('<Button-1>', clear_all)
top_frame_input.focus()

# ======top icons==========
top_frame_icons = []

for i in range(0, 7):

    top_frame_icons.append(

        Button(topFrame, text='X',

               font="Helvetica 15 bold", height=1, width=2)

    )

    top_frame_icons[i].grid(row=0, column=i)

# ===========Listbox with scrollbar=================
entries_list = Listbox(leftFrame, exportselection=0, height=15, width=40)
entries_list.pack(side=LEFT, fill=BOTH, expand=True)

entries_list_scrollbar = Scrollbar(leftFrame, orient=VERTICAL)  # scrollbar
entries_list_scrollbar.pack(side=LEFT, fill=BOTH)

entries_list_scrollbar.configure(command=entries_list.yview)
entries_list.configure(yscrollcommand=entries_list_scrollbar.set)

# =======num pad==========
keyboard = []
keys = "HMS789456123C0:"
i = 0
for j in range(1, 6):
    for k in range(3):
        keyboard.append(Button(rightFrame, text=keys[i], font="Helvetica 15 bold", height=1, width=2))
        keyboard[i].grid(row=j, column=k, pady=2, padx=2)
        keyboard[i]["command"] = lambda x=keys[i]: num_press(x)
        i += 1

# --------other buttons---------
add_entry_button = Button(rightFrame, text="+", font="Helvetica 15 bold", height=6, width=7)
add_entry_button.grid(row=1, column=4, rowspan=4, columnspan=2, pady=2, padx=2)
add_entry_button.bind('<Button-1>', add_entry)

clear_one_button = Button(rightFrame, text="←", font="Helvetica 15 bold", height=1, width=2)
clear_one_button.grid(row=5, column=4, pady=2, padx=2)
clear_one_button.bind('<Button-1>', clear_one)

modulo_button = Button(rightFrame, text="M24", font="Helvetica 15 bold", height=1, width=2)
modulo_button.grid(row=5, column=5, pady=2, padx=2)
modulo_button.bind('<Button-1>', add_entry)

# =====bottom status=============
status = StringVar()
bottom_status_total = Label(bottomFrame, textvariable=status, bd=1, relief=SUNKEN,
                            font="Helvetica 15 bold", width=54)
status.set(total_info)
bottom_status_total.pack(fill=X, expand=True, side=TOP, ipady=10, ipadx=10)

# ============================================

win.mainloop()

7 uwag do wpisu “Czyszczenie kodu – Python podstawy PEP8

      1. Tak, ale w Pythonie jest dodatkowy ból, że zmienne globalne możesz definiować wszędzie (np w ciele metody) i nigdy nie wiadomo co się z nimi stanie. W cpp na przykład jest szansa że te globale będą w jednym miejscu, co nieco ułatwi debuggowanie.

        Polubienie

Dodaj komentarz