Moduł „click” pozwala odbierać od użytkownika parametry przekazywane do skryptu. Dawniej był stosowany moduł „argparse” do tego samego celu, jednak był niewygodny i mało intuicyjny toteż obecnie używany jest raczej „click”. Zacznijmy od prostego skryptu przyjmującego jeden parametr.
import click
@click.command()
@click.option('-i')
def witacz(i):
print(f'Witaj {i}')
witacz()
To jest cała zawartość mojego pliku app.py. Funkcja witacz raczej nie należy do złożonych – przyjmuje przez argument imię osoby którą ma powitać. Magia dzieje się dzięki dekoratorom @click.command() i @click.option(). Pierwsza informuje moduł click że funkcja witacz jest przez niego obsługiwana. Drugi określa nazwę parametru którego użyjemy przy wywoływaniu skryptu – nazwa tego parametru musi się pokrywać z nazwą parametru wywoływanej funkcji. Wywołanie skryptu:
python app.py -i Andrzej
Efekt na konsoli:
Witaj Andrzej
Jeśli podkusiła Cię ciekawość i sprawdziłeś co się stanie jeśli nie podamy parametru, to zobaczyłeś:
Witaj None
Oczywiście nie jest to efekt jaki chcielibyśmy uzyskać. Jak więc zmusić click do żądania wartości tego parametru w przypadku jego niepodania? Do dekoratora @click.option dodajemy jeszcze argument „prompt”. W przypadku nie podania wartości dla parametru zostaniemy o to poproszeni:
import click
@click.command()
@click.option('-i',prompt=True)
def witacz(i):
print(f'Witaj {i}')
witacz()
Alternatywnie możemy zastosować argument „required”:
import click
@click.command()
@click.option('-i',required=True)
def witacz(i):
print(f'Witaj {i}')
witacz()
Różnica sprowadza się do tego, że w pierwszym przypadku zostaniemy poproszeni o podanie wartości dla argumentu, w drugim dostaniemy komunikat tego typu:
Usage: app.py [OPTIONS]
Try 'app.py --help' for help.
Error: Missing option '-i'.
A skrypt nie jest uruchamiany.
Aby zastosować wiele argumentów na raz wystarczy dodać kilka dekoratorów @click.option:
import click
@click.command()
@click.option('-i')
@click.option('-n')
def witacz(i,n):
print(f'Witaj {i} {n}')
witacz()
Skrypt wywołujemy tak:
python app.py -i Andrzej -n Klusiewicz
Efekt na konsoli:
Witaj Andrzej Klusiewicz
Kolejność podawania parametrów nie ma znaczenia.
Click automatycznie dodaje parametr „—help”, po zastosowaniu którego wyświetla się pomoc. Treść pomocy deklarujemy przy użyciu argumentu dekoratora option w ten sposób:
import click
@click.command()
@click.option('-i',help='Imię witanej osoby')
@click.option('-n',help='Nazwisko witanej osoby')
def witacz(i,n):
print(f'Witaj {i} {n}')
witacz()
Wywołanie skryptu w ten sposób:
python app.py –help
Spowoduje wyświetlenie pomocy:
Usage: app.py [OPTIONS]
Options:
-i TEXT Imię witanej osoby
-n TEXT Nazwisko witanej osoby
--help Show this message and exit.
Przykład znaleziony w dokumentacji, ale jest tak fajny że postanowiłem go tu umieścić ku uciesze administratorów 😉. Często pojawiający się w pracy (mojej) problem to tajność haseł pojawiających się w kodzie źródłowym. Można ten problem rozwiązać na kilka sposobów, ale jednym z nich jest wykorzystanie funkcjonalności modułu click. Wyobraźmy sobie że w skrypcie jest jawnie zawarte hasło do bazy danych. Zamiast je podawać jawnie, możemy nie tylko przyjąć je przez parametr, ale jednocześnie ukryć wprowadzane znaki. Ukrywanie wprowadzanych znaków zapewnia nam argument „hide_input”. Możesz też (opcjonalnie) wykorzystać argument „confirmation_prompt” który powoduje konieczność potwierdzenia wprowadzonej wartości. Bardzo wygodne w sytuacjach gdy nasz skrypt ma na przykład ustawiać jakieś hasło.
import click
@click.command()
@click.option('--password',prompt=True,confirmation_prompt=True,hide_input=True)
def connectDatabase(password):
print(f'connecting to database. Url: user/{password}@jsystems.pl/databaseName')
connectDatabase()
Efekt działania powyższego kodu:
python app.py
Password:
Repeat for confirmation:
connecting to database. Url: user/moje_haslo@jsystems.pl/databaseName
Komentarze (0)
Brak komentarzy...