2013-02-23 12 views
41

Kiedy piszę moduł Pythona i funkcjonuje w nim, mam pewne "publiczne" funkcje, które mają być wystawione na zewnątrz, ale niektóre inne "prywatne" funkcje, które tylko powinny być widoczne i używane lokalnie i wewnętrznie.Python "prywatna" funkcja kodowania konwencja

Rozumiem w python nie ma absolutnych prywatnych funkcji. Ale jaki jest najlepszy, najbardziej schludny lub najczęściej używany styl, aby odróżnić "publiczne" funkcje od "prywatnych" funkcji?

Wymienię niektóre style znam:

  1. korzystanie __all__ w pliku modułu do wskazania jego funkcji „publiczny” (What's the python __all__ module level variable for?)
  2. użycie podkreślenia na początku nazwy „prywatnych” funkcji

Czy istnieje inny pomysł lub konwencja, z której korzystają ludzie?

Dziękuję bardzo!

Odpowiedz

67

Z dokumentacji modułu Class Pythona:

prywatna”zmienne instancji, które nie mogą być dostępne z wyjątkiem wewnątrz obiektu nie istnieje w Pythonie. Istnieje jednak konwencja, po której następuje większość kodu Pythona: nazwa z prefiksem podkreślenia (np. _spam) powinna być traktowana jako niepubliczna część API (bez względu na to, czy jest to funkcja, metoda czy element danych) . Należy go traktować jako szczegół wdrożenia i może ulec zmianie bez powiadomienia.

Ponieważ istnieje ważna przypadek użycia dla członków prywatnej klasy (tj. W celu uniknięcia zderzeń nazw nazw o nazwach zdefiniowanych przez podklasy), istnieje ograniczone wsparcie dla takiego mechanizmu, zwane manglingiem nazw. Dowolny identyfikator formularza __spam (co najmniej dwa wiodące podkreślenia, najwyżej jedno końcowe podkreślenie) jest zastępowany tekstowo przez _classname__spam, gdzie classname jest bieżącą nazwą klasy z usuniętymi wiodącymi podkreślnikami. Takie manipulowanie odbywa się bez względu na pozycję syntaktyczną identyfikatora, o ile występuje w definicji klasy.

+1

Dziękujemy! Więc ogólnie ludzie po prostu używają wiodącego podkreślenia, aby odróżnić funkcje "publiczne" od "prywatnych" w module? – Kaifei

+9

Głównie. Tak jak mówi dokumentacja, jest to konwencja, nadal można uzyskać dostęp do funkcji, takich jak te, które są publiczne, ale "poprawny" sposób na robienie rzeczy to udawanie, że tak naprawdę ich tam nie ma. –

+0

Czy ta konwencja ma zastosowanie do funkcji, które nie są oparte na klasach? – radtek