Python: Tworzenie bibliotek

Kiedy chcemy współdzielić kod, a może kiedy kod jest już zbyt duży, a może w celu lepszej izolacji? Tworzenie bibliotek w Pythonie w kilku prostych krokach.

Python: Tworzenie bibliotek

Python: Tworzenie bibliotek


Podczas automatyzacji testów z wykorzystaniem Pythona, często korzystamy z importu różnych bibliotek. Jednak gdy zewnętrzne biblioteki nie spełniają naszych oczekiwać, dochodzimy do wniosku, że potrzebujemy własnej biblioteki. Python udostępnia kilka metod importu naszych wewnętrznych lokalnych źródeł. Co jednak jeśli chcemy udostępnić komuś przygotowaną bibliotekę lub narzędzie? Zawsze możemy je na przykład wysłać mailem. Pytanie tylko, czy jest to optymalne forma?

Wysyłanie kodu mailem czy przekazywaniem go sobie w inny sposób jest rozwiązaniem, które niesie za sobą wiele problemów, takich jak:

  • problemy z utrzymaniem – gdy kilka czy kilkanaście osób korzysta  z jednej paczki kodu, ciężkie, jeśli nie niewykonalne, jest utrzymanie jednej wersji we wszystkich miejscach.
  • kłopotliwe pozyskanie biblioteki – aby skorzystać z naszych zasobów, osoba zainteresowana musi się do nas zgłosić bezpośrednio.
  • problemy z adaptacją kodu – często, jeśli kod jest pisany pod dany projekt, zostają w nim zawarte różne specyficzne dla danego środowiska metody.

Aby uniknąć powyższych zagrożeń, dobrym rozwiązaniem jest przygotowanie paczki i umieszczenie jej na serwerze. Można tego dokonać w kilku krokach.

Przygotowanie kodu

Podczas przygotowania kodu w celu stworzenia biblioteki, najlepszym wyborem jest stosowanie się do zasad PEP8. Należy również pamiętać o odpowiednim i konsekwentnym nazewnictwie wszystkich metod oraz odpowiednim oznaczeniu metod przeznaczonych do użytku wewnętrznego. Jako że w Pythonie nie ma szeroko pojętej hermetyzacji, dlatego też dobrą praktyką jest oznaczanie metod wewnętrznych, czyli nienależących do interfejsu klasy, poprzez rozpoczynanie ich od podkreślenia, np.

def _metoda_wewnętrzna():
    return True
 
def metoda_zewnętrzna():
    return True

W późniejszym użytkowania pomocne są także odpowiednie komentarze. Podczas przygotowania biblioteki, należy korzystać z komentarzy oznaczanych za pomocą potrójnego apostrofa ”'(lub potrójnego cudzysłowie – „””), dzięki temu będzie można je później w prosty sposób podejrzeć.

Kolejną rzeczą, na którą należy zwrócić uwagę, jest sposób importu lokalnych plików wewnątrz paczki. Z racji tego, że biblioteka ma być odseparowanym bytem, nie można w niej wykonywać importów bezwzględnym, tylko relatywne, czyli zamiast importowania:

import workspace/nowa_paczka/dodatkowe_funckje

użyjemy:

import .dodatkowe_funkcje

Przygotowanie pakietu

Przygotowanie pakietu rozpoczynamy od stworzenia odpowiedniej struktury katalogów, która powinna wyglądać jak poniżej: 

my_library/
├── setup.py
├── my_library
├── init.py
├── package2.py
├── package1.py
└── package3.py

W powyższym przykładzie biblioteka składa się z trzech plików z kodem źródłowym oraz pliku __init__.py, który informuje, że jest to projekt. Pliki te powinny się znaleźć w wewnętrznym katalogu z nazwą tworzonej biblioteki. W zewnętrznym katalogu, który również powinien się nazywać jak biblioteka, należy umieścić plik setup.py.

Plik setup.py

Poniżej przedstawiam przykładowa zawartość pliku setup.py. Po drobnych korektach można ją wykorzystać w innych bibliotekach.

    from setuptools import setup, find_packages
     
    setup(name=‚testjira',
          version='1.2’,
          author='Wojciech - Qabrio.pl',
          author_email='wojciech.qabrio@gmail.com',
          license='For internal use',
          description='This package contain jira utilities',
          packages=find_packages(),
          install_requires=['jira',]
          )

Powyższy przykład zawiera jedynie część informacji, jakie mogą być umieszczone w tym pliku, jednak są one wystarczające do stworzenia własnej biblioteki:

  • name – nazwa biblioteki, taka sama jak folderów,
  • version – aktualna wersja biblioteki,
  • author – informacje o autorze,
  • author_email – email do autora,
  • license – licencja lub warunki korzystania,
  • description – co zawiera biblioteka,
  • packages – informacja o pakietach w bibliotece (najlepiej jest wykorzystać tutaj funkcję find_packages, która automatycznie znajdzie wszystkie pakiety),
  • install_requires – informacja o wykorzystanych zewnętrznych pakietach, dzięki czemu podczas instalacji biblioteki zostaną one automatycznie zainstalowane.

Weryfikacja pakietu

Mając przygotowaną strukturę katalogów oraz pliki z biblioteką, możemy użyć sdist, które zweryfikuje poprawność przygotowania pakietu. Aby to wykorzystać, należy wykonać polecenie:

qabrio@test:~$ python setup.py sdist

Po bezproblemowym wykonaniu polecenia można być pewnym poprawności struktury biblioteki. Dodatkowo, pojawi się folder dist ze spakowaną biblioteką (może się przydać do lokalnego użycia).

Udostępnianie biblioteki

Stworzoną bibliotekę najlepiej udostępnić z wykorzystaniem popularnego systemu kontroli wersji – Gita. Jest oczywiście możliwość umieszczenia jej w repozytoriach Pythona, lecz będzie ona wtedy dostępna dla wszystkich.

Aby udostępnić bibliotekę z wykorzystaniem Gita, należy stworzyć repozytorium. Następnie dodajemy do niego wszystkie stworzone pliki i wysyłamy na serwer. Wykonać to można w następujący sposób:

qabrio@test:~$ git add –all
qabrio@test:~$ git commit –m ’Ms’
qabrio@test:~$ git tag -a 1.2 -m'New version’
qabrio@test:~$ git remote add origin ssh://...
qabrio@test:~$ git push origin master --tags

Bardzo istotne jest otagowanie commita z konkretną wersją, oraz jej opisem. Należy o tym pamiętać przy wysyłaniu repozytorium na serwer dodając słowo kluczowe –tags, co spowoduje również wysłanie tagów. Umożliwi to późniejsze pobieranie konkretnej wersji.

Pobieranie biblioteki

Mając bibliotekę na serwerze, można ją pobrać wykorzystując narzędzie do instalacji pakietów pip/pip3. Instalację najnowszej wersji można wykonać używając komendy:

qabrio@test:~$ pip install -e git+ssh://git@[link_do_gita]/my_library.git#egg=my_library

Instalacje konkretnej wersji (zgodnej z tagami), można również wykonać przy użyciu narzędzia pip:

qabrio@test:~$ pip install -e git+ssh://git@[link_do_gita/my_library.git@1.2#egg=my_library

Co można zyskać?

  • Bezproblemowe udostępnianie,
  • możliwość pobierania dowolnej wersji,
  • korzystanie jak z zewnętrznej biblioteki,
  • automatyczne instalacja wymaganych zewnętrznych bibliotek,
  • przy korzystaniu z wirtualnych środowisk, ścieżka do instalacji jest zawarta w liście bibliotek,
  • bezpieczne przechowyanie kodu.

close

Newsletter