Przewodnik po stylu kodowania¶
Niniejszy przewodnik zawiera informacje i wytyczne dotyczące pisania kodu dla BeeWare.
Styl kodowania¶
BeeWare stosuje PEP 8 w naszym kodzie źródłowym, z wyjątkiem długości linii, która została zwiększona z 79 do 88 znaków. W miarę możliwości stosujemy Ruff w celu egzekwowania konwencji PEP 8. Podczas zatwierdzania kodu pre-commit przeprowadza kontrole, w tym Ruff. W miarę możliwości spowoduje to automatyczne sformatowanie kodu, aby zapewnić zgodność z naszymi standardami formatowania i stylu. Niektóre środowiska IDE można skonfigurować tak, aby automatycznie uruchamiały Ruff podczas zapisywania, co może ułatwić ten proces.
Należy pamiętać, że najważniejszą częścią PEP 8 jest Sekcja 0: Głupia spójność jest zmorą małych umysłów. Istnieją sytuacje, w których zachowanie spójności z PEP 8 nie ma sensu i ważne jest, aby zrozumieć, że w stosownych przypadkach dopuszczalne, a czasem nawet preferowane jest pisanie kodu, który nie jest zgodny z wymienionymi zasadami. Wiedza o tym, kiedy należy odstąpić od tych zasad, jest równie ważna jak zachowanie spójności w większości sytuacji.
Jednym z przejawów tego zjawiska są konwencje nazewnictwa. Biblioteki BeeWare
często muszą zapewniać integrację z innymi językami. Podczas tworzenia nakładek
na inne języki wskazane jest (a w niektórych przypadkach wręcz konieczne)
stosowanie konwencji nazewniczych języka docelowego, a nie języka Python. Na
przykład podczas wywoływania lub odwoływania się do kodu Java funkcje powinny
być zapisywane zgodnie z preferencjami języka Java, czyli mixedCase, a nie
zgodnie z zaleceniami PEP 8, które przewidują snake_case.
W nazewnictwie API, zmiennych itp. stosujemy pisownię amerykańską.
W PEP 8 wprowadzono również pewne uzupełnienia dotyczące konkretnie BeeWare:
Rozdzielanie długich wywołań funkcji¶
Jeśli wywołanie funkcji z więcej niż jednym argumentem nie mieści się w jednym wierszu, każdy argument należy umieścić w osobnym wierszu, a po ostatnim argumencie dodać przecinek. Ruff zezwala (i sugeruje) formatowanie wielu argumentów w jednym wierszu z przełamaniem:
my_function(
arg1, arg2, arg3
)
Nie należy stosować tego stylu. Zamiast tego należy rozdzielić argumenty tak, aby w każdym wierszu znajdował się tylko jeden, dodając przecinek na końcu ostatniego argumentu:
my_function(
arg1,
arg2,
arg3,
)
Dzielenie długich ciągów znaków¶
Jeśli argument typu ciąg znaków musi zostać podzielony na kilka wierszy, aby spełnić wymagania dotyczące długości wiersza, należy ująć połączone literały ciągu znaków w nawiasy, aby było jasne, że ciąg ten stanowi jeden argument. Innymi słowy, zalecamy następujące rozwiązanie:
my_function(
(
"this is a very long string "
"that is wrapped over two lines"
),
second_argument,
)
ponad:
my_function(
"this is a very long string "
"that is wrapped over two lines",
second_argument,
)
Rzeczy, których należy unikać¶
Staramy się unikać modułów utils w miarę możliwości, rozumiejąc jednak, że
czasami są one nieuniknione. Preferowaną alternatywą jest znalezienie miejsca
dla danej funkcji w innym miejscu kodu źródłowego zamiast używania modułu
utils.
Zasadniczo staramy się unikać lub odkładać na później wszelkie kosztowne kody inicjalizacyjne, aby przyspieszyć uruchamianie aplikacji. Na przykład moduły w pakiecie toga-core są „ładowane leniwie” — są importowane dopiero po zgłoszeniu żądania, a nie z góry. Przyspiesza to uruchamianie i pozwala poświęcić czas tylko na to, czego faktycznie używa aplikacja.