
Pyggester- (Python + Suggester)는 동적 및 정적 분석기로 기능합니다. 주요 목적은 데이터 구조의 차선 적 사용을 해결함으로써 Python 코드의 효율성을 향상시키기위한 제안을 제공하는 데 있습니다.
Pyggester는 기능에 대해 꽤 괜찮은 CLI 인터페이스를 제공합니다. CLI는 타이퍼 위에 제작되었습니다
Execution command :
pyggest output :
_____
_____________ ________ _______ ______________ /_____________
___ __ _ / / /_ __ `/_ __ `/ _ _ ___/ __/ _ _ ___/
__ /_/ / /_/ /_ /_/ /_ /_/ // __/(__ )/ /_ / __/ /
_ .___/___, / ___, / ___, / ___//____/ __/ ___//_/
/_/ /____/ /____/ /____/
Usage: pyggest [OPTIONS] COMMAND [ARGS]...
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --install-completion Install completion for the current shell. │
│ --show-completion Show completion for the current shell, to copy it or customize the installation. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ static Perform static analysis using PyggestStatic. │
│ transform Perform dynamic transformation using PyggesterDynamic. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Pyggester CLI는 두 가지 특징을 제공합니다.
정적 분석 :이 기능은 코드를 실행하지 않고도 종합적으로 검사하여 구조 및 잠재적 개선에 대한 통찰력있는 통찰력을 제공합니다.
Execution command
[! 참고] '정적'서브 컨볼 맨이 존재하지만 이미 정적 분석기 (Pylint, Ruff, Flake8)가 있기 때문에 기능이 없습니다. 향후 반복에서 정적 분석을 통해 확립 할 수있는 제안을 식별하면이 기능에 포함시킬 것입니다.
pyggest static동적/자동 변환 :이 기능은 Python 파일에 추가 코드를 추가하여 런타임시 데이터 구조를 분석합니다. 원래 코드는 동일하게 유지됩니다. 변경되지 않습니다. 원본과 같지만 추가 코드가있는 새 파일이 생성됩니다. 이것은 단일 파일과 전체 디렉토리 (전체 프로젝트 구조) 모두에서 작동합니다.
Execution command
pyggest transform[! info] Pyggester는 자세한 사용을위한 내장 문서를 제공합니다
pyggest transform --help
pyggest static --help # NOT IMPLEMENTEDPIP를 사용하여 파이썬 라이브러리를 쉽게 설치할 수 있습니다. 터미널을 열고 다음 명령을 실행하십시오.
pip install pyggester저장소 복제 : 터미널을 열고 다음 명령을 실행하여 Github 리포지토리를 로컬 컴퓨터로 복제하십시오.
git clone [email protected]:ValdonVitija/pyggester.git저장소로 이동 : 작업 디렉토리를 복제 된 저장소로 변경하십시오.
cd pyggesterPyggester를 현지에서 Pacakge로 설치하십시오.
[! 중요] 가능하면 가상 환경 (VENV) 내 에서이 작업을 수행하는 것을 고려하십시오.
pip install .동적으로 분석하려는 단일 파이썬 파일이 있다고 가정 해 봅시다 (런타임 분석).
Pyggester로 코드 변환 전에 :
(venv) root@user: ~ /my_app > ls
app.pyapp.py의 내용 :
def sum_of_integers ( integer_list ):
total = sum ( integer_list )
return total
my_list = [ 1 , 2 , 3 , 4 , 5 ]
print ( sum_of_integers ( my_list ))중요한
다음 단계로 가기 전에 Pyggester가 설치된 가상 환경에 있는지 확인하십시오.
(venv) root@devs04: ~ /my_app > pyggest transform app.py
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ File transformed successfully ! │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯(venv) root@devs04: ~ /my_app > ls
app.py app_transformed.pyapp_transformed.py의 내용 :
from pyggester . observable_collector import OBSERVABLE_COLLECTOR
from pyggester . observables import ObservableNumpyArray , ObservableNamedTuple , ObservableSet , ObservablePandasDataFrame , ObservableList , ObservableDict , ObservableTuple
def sum_of_integers ( integer_list ):
total = sum ( integer_list )
return total
my_list = ObservableList ([ 1 , 2 , 3 , 4 , 5 ])
OBSERVABLE_COLLECTOR . append ( my_list )
print ( sum_of_integers ( my_list ))
for observable in OBSERVABLE_COLLECTOR :
observable . run ()중요한
이제 자동으로 작성된 새 파일이있어 원본 파일을 반영합니다. 이 새 파일에는 원본의 모든 내용과 런타임 동안 코드를 분석하기위한 추가 코드가 포함되어 있습니다. 원래 'app.py'를 실행하는 대신 이제 'app_transformed.py'를 실행해야합니다. 'app.py'의 모든 것은 'app_transformed.py'에 유지됩니다.
(venv) root@devs04: ~ /my_app > python3 app_transformed.py
15
╭────────────────────────────────────────────────────────────────────────────╮
│ 10 | Suggestions(/root/my_app/app_transformed.py): │
│ [ * ] Consider using an array.array instead of a list, for optimal │
│ memory consumption │
│ [ * ] Consider using a set instead of a list, because of unique elements │
╰────────────────────────────────────────────────────────────────────────────╯동적으로 분석하려는 Python Project (Directory/Repo)가 있다고 가정 해 봅시다 (런타임 분석).
Pyggester로 코드 변환 전에 :
(venv) root@devs04: ~ /python_demo/app_dir > ls
__pycache__ app.py temperature.py weather.pyapp.py의 내용 :
import weather
import temperature
def main ():
city = input ( 'Enter a city name: ' )
weather_condition = weather . get_weather ( city )
avg_temp = temperature . get_average_temperature ()
print ( f'Weather in { city } : { weather_condition } ' )
print ( f'Average temperature: { avg_temp } degrees Celsius' )
main ()온도의 내용 :
temperatures = list ([ 20 , 22 , 15 , 18 , 20 , 21 , 22 , 22 , 18 , 17 , 20 ])
def get_average_temperature ():
return sum ( temperatures ) / len ( temperatures )Weather.py의 내용 :
weather_conditions = [ 'Sunny' , 'Rainy' , 'Cloudy' , 'Windy' , 'Sunny' , 'Cloudy' ]
def get_weather ( city ):
return weather_conditions . pop ()중요한
다음 단계로 가기 전에 Pyggester가 설치된 가상 환경에 있는지 확인하십시오.
(venv) root@devs04: ~ /python_demo > pyggest transform app_dir/
Enter the name of the main file: app.py
╭──────────────────────────────────────────────────────────────────────────╮
│ Directory transformed successfully ! │
╰──────────────────────────────────────────────────────────────────────────╯중요한
디렉토리 또는 프로젝트가 인수로 지정되면 Pyggester는 프로젝트의 기본 파일을 지정하도록 유도합니다. 이 파일은 파일 이름으로 표시된 프로젝트의 진입 점이어야합니다.
(venv) root@devs04: ~ /python_demo > ls
app_dir app_dir_transformedapp_dir_transformed/:
( venv ) root @ devs04 : ~ / python_demo / app_dir_transformed > ls
app . py temperature . py weather . pyapp.py의 내용 :
from pyggester . observable_collector import OBSERVABLE_COLLECTOR
from pyggester . observables import ObservableNumpyArray , ObservableList , ObservablePandasDataFrame , ObservableNamedTuple , ObservableSet , ObservableDict , ObservableTuple
import weather
import temperature
def main ():
city = input ( 'Enter a city name: ' )
weather_condition = weather . get_weather ( city )
avg_temp = temperature . get_average_temperature ()
print ( f'Weather in { city } : { weather_condition } ' )
print ( f'Average temperature: { avg_temp } degrees Celsius' )
main ()
for observable in OBSERVABLE_COLLECTOR :
observable . run ()온도의 내용 :
from pyggester . observable_collector import OBSERVABLE_COLLECTOR
from pyggester . observables import ObservableNumpyArray , ObservableList , ObservablePandasDataFrame , ObservableNamedTuple , ObservableSet , ObservableDict , ObservableTuple
temperatures = ObservableList ( list ([ 20 , 22 , 15 , 18 , 20 , 21 , 22 , 22 , 18 , 17 ,
20 ]))
OBSERVABLE_COLLECTOR . append ( temperatures )
def get_average_temperature ():
return sum ( temperatures ) / len ( temperatures )Weather.py의 내용 :
from pyggester . observable_collector import OBSERVABLE_COLLECTOR
from pyggester . observables import ObservableNumpyArray , ObservableList , ObservablePandasDataFrame , ObservableNamedTuple , ObservableSet , ObservableDict , ObservableTuple
weather_conditions = ObservableList ([ 'Sunny' , 'Rainy' , 'Cloudy' , 'Windy' ,
'Sunny' , 'Cloudy' ])
OBSERVABLE_COLLECTOR . append ( weather_conditions )
def get_weather ( city ):
return weather_conditions . pop ()중요한
이제 원래 디렉토리를 반영하는 새 디렉토리가 자동으로 작성되었습니다. 이 새 디렉토리에는 원본의 모든 내용과 런타임 동안 코드 분석을위한 추가 코드가 포함되어 있습니다. 원래 'app.py'를 실행하는 대신 'App_dir_transformed/'내부에있는 'App.py'를 실행해야합니다. 'APP_DIR'의 모든 것은 'APP_DIR_TRANSFORMED/'에 유지됩니다.
(venv) root@devs04: ~ /python_demo/app_dir_transformed > python3 app.py
Enter a city name: Pristina
Weather in Pristina: Cloudy
Average temperature: 19.545454545454547 degrees Celsius
╭─────────────────────────────────────────────────────────────────────────────────────╮
│ 3 | Suggestions(/root/python_demo/app_dir_transformed/temperature.py): │
│ [ * ] Consider using an array.array instead of a list, for optimal memory │
│ consumption │
╰─────────────────────────────────────────────────────────────────────────────────────╯ .
├── LICENSE
├── README.md # main readme file. The one you are currently reading.
├── VERSION # version of pyggester
├── contributing.md
├── pyggester # directory containing the full source code of pyggester
│ ├── __init__.py
│ ├── cli.py # defines the typer cli structure(command & options)
│ ├── command_handlers.py # Handles subcommands and every option variation per subcommand.
│ ├── data # data/config files related to pyggester.
│ │ └── help_files # build in help files for the pyggester cli
│ │ ├── __init__.py
│ │ ├── transform_helper.md # detailed built-in documentation for the transform subcommand of pyggest
│ │ └── static_helper.md # detailed built-in documentation for the static subcommand of pyggest
│ ├── helpers.py # helper functions to be used by other modules
│ ├── main.py # The entry point of pyggest execution. Initializes the typer cli app and prints the ascii logo of pyggester
│ ├── message_handler.py # Manages how the collected messages will be printed to the user.
│ ├── module_importer.py # Contains the mechanism to automatically import observables
│ ├── observable_collector.py # Contains the list that will be used to collect all observables.
│ ├── observable_transformations.py # Contains the mechanism that will automatically add code that collects observables and glues together all ast modules
│ ├── observables.py # Contains all the defined observables(enhanced version of python collections)
│ ├── pyggester.py # The 'engine' of pyggester. This module glues everything together
│ ├── text_formatters.py # Contains text formatters, to beautify text in stdout.
│ └── wrappers.py # Contains the mechanism that wrap each observable.
├── pyggester_abstract_execution_flow.png
├── pyggester_logo.png
├── pytest.ini # pytest config file
├── requirements.txt # Every pyggester dependecy resides here
├── setup.py # Creates the pyggester pacakge and defines pyggest as the entry point command to execute pyggester
└── tests
├── __init__.py
├── test_cli.py
├── test_command_handlers.py
├── test_file.py
├── test_file_transformed.py
├── test_helpers.py
├── test_main.py
├── test_message_handler.py
├── test_module_importer.py
├── test_observable_transformations.py
├── test_observables.py
├── test_pyggester.py
└── test_wrappers.py다음 흐름도는 Pyggester의 주요 구성 요소를 보여 주며 실행 시퀀스에 대한 포괄적 인 개요를 제공합니다.

이 프로젝트에 기여하려면 자세한 지침 및 모범 사례는 포괄적 인 기여 가이드를 참조하십시오.
MIT 라이센스
저작권 (C) 2023 Valdonvitijaa
이에 따라이 소프트웨어 및 관련 문서 파일 ( "소프트웨어")의 사본을 얻는 사람에게는 허가가 부여됩니다. 소프트웨어의 사용, 복사, 수정, 합병, 배포, 배포, 숭고 및/또는 소프트웨어의 사본을 판매 할 권한을 포함하여 제한없이 소프트웨어를 처리 할 수 있도록 소프트웨어를 제공 할 권한이 없습니다.
위의 저작권 통지 및이 권한 통지는 소프트웨어의 모든 사본 또는 실질적인 부분에 포함되어야합니다.
이 소프트웨어는 상업성, 특정 목적에 대한 적합성 및 비 침해에 대한 보증을 포함하여 명시 적 또는 묵시적 보증없이 "그대로"제공됩니다. 어떠한 경우에도 저자 또는 저작권 보유자는 계약, 불법 행위 또는 기타, 소프트웨어 또는 소프트웨어의 사용 또는 기타 거래에서 발생하는 계약, 불법 행위 또는 기타의 행동에 관계없이 청구, 손해 또는 기타 책임에 대해 책임을지지 않습니다.