Dzień dobry wszystkim!
29 lutego 2020 roku odbyła się oficjalna mikro-referencja bibliotek smart-env i python-shell. Dla tych, którzy nie są na bieżąco, proponuję wcześniejsze przeczytanie .
Krótko mówiąc, wśród zmian są: autouzupełnianie poleceń, rozszerzone możliwości uruchamiania poleceń, trochę refaktoryzacji oraz poprawki błędów.
Po szczegóły zapraszam pod kat.
Co nowego w python-shell?
Zacznę od deseru.
Automatyczne uzupełnianie poleceń
Zgadzam się — to wygodne, kiedy edytor/IDE/terminal podpowiada nazwę polecenia, a czasami także parametry jego wywołania? Python-shell stopniowo rozwija tę funkcjonalność. Z uwagi na to, że pola klasy Shell pod kapotą de-facto nie są jego polami (wszechobecny __getattr__), autouzupełnianie zostało stworzone również od podstaw (przez przeciążenie, odpowiednio, metody __dir__). Obecnie autouzupełnianie działa w środowiskach BPython i IPython. Oczywiście, chcielibyśmy zobaczyć integrację z bardziej uznawanymi produktami, takimi jak PyCharm, i w tym kierunku prowadzone są badania możliwości realizacji.
Dodanie właściwości
W ramach wydania klasa Shell otrzymała nową właściwość last_command. Potrzeba ta wynikła z faktu, że podczas generowania wyjątku ShellException przez polecenie z niezerowym kodem zwrotu obiekt Command nie był zwracany z wywołania __call__() obiektu polecenia. Teraz istnieje możliwość zrobienia tak:
try:
command = Shell.touch('/foo.txt')
except ShellException:
command = Shell.last_commandRównież lista właściwości obiektu Command została rozszerzona. Dodano pole errors, które zwraca wynik polecenia do strumienia błędu.
Uruchamianie poleceń z nieprawidłowymi nazwami w Pythonie
Praktycznie w każdym systemie istnieje przynajmniej jeden program, którego nazwa nie pasuje jako identyfikator w Pythonie (na przykład znane narzędzie 2to3). Wywołanie go za pomocą
Shell.2to3() nie będzie możliwe — interpreter tego nie przepuści.
Rozwiązanie — wywołać polecenie okrężną drogą:
Shell("2to3") # zwraca obiekt poleceniaWarto zauważyć, że w ten sam sposób można uruchamiać również poprawne z punktu widzenia interpretera polecenia, co daje możliwość tworzenia elastycznych skryptów, takich jak
cmd = "python{}".format(sys.version_info[0])
Shell(cmd)(*args, **kwargs)Drobne zmiany
- Zrealizowane metody __repr__() i __str__() obiektu klasy Command, które teraz zwracają intuicyjnie zrozumiałe wartości (polecenie z parametrami oraz jego stdout).
- Drobne poprawki w kodzie.
- Dodanie pokrycia testami, a także reorganizacja istniejących.
- Dodanie klas Subprocess i Process, których celem jest stworzenie dodatkowego poziomu abstrakcji przy pracy z modułem subprocess. W dużej mierze jest to konieczne w celu wyeliminowania powtórzeń kodu przy pracy z Pythonem 2/3, ale potencjalnie może także przynieść inne korzyści.
Co nowego w smart-env?
W odróżnieniu od python-shell, w bibliotece smart-env zmiany były niewielkie. Powód jest prosty — brak wolnego czasu, w wyniku czego niektóre potencjalne ulepszenia (np. autouzupełnianie zmiennych środowiskowych) zostały przeniesione na kolejny wydanie.
Faktycznie, w bibliotece wprowadzono następujące zmiany:
- Drobne poprawki w kodzie.
- Refaktoryzacja.
- Reorganizacja i poprawa istniejących testów.
Plany dotyczące kolejnych wydań
Biblioteka python-shell
- Dodanie wsparcia dla nieblokujących wywołań komend (paralelizacja wykonania).
Biblioteka smart-env
- Realizacja autouzupełniania zmiennych środowiskowych w klasie ENV.
- Wsparcie dla operatora in w celu sprawdzenia istnienia zmiennej env.
- Realizacja wsparcia dla funkcji str() i repr() dla klasy ENV.
Daty kolejnych wydań zostaną ogłoszone w następujących kanałach komunikacji:
- Aktualizacja w tym artykule.
Źródło: habr.com
