
Pyggester - (Python + Suggester) ทำหน้าที่เป็นทั้งเครื่องวิเคราะห์แบบไดนามิกและแบบคงที่ วัตถุประสงค์หลักของมันอยู่ในการเสนอคำแนะนำเพื่อเพิ่มประสิทธิภาพของรหัส Python โดยการใช้โครงสร้างข้อมูลที่ไม่ดี
Pyggester นำเสนออินเทอร์เฟซ CLI ที่ดีสำหรับฟังก์ชันการทำงาน CLI ถูกสร้างขึ้นบน Typer
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[! ข้อมูล] Pyggester นำเสนอเอกสารในตัวสำหรับการใช้งานโดยละเอียด
pyggest transform --help
pyggest static --help # NOT IMPLEMENTEDคุณสามารถติดตั้งไลบรารี Python ได้อย่างง่ายดายโดยใช้ PIP เปิดเทอร์มินัลของคุณและเรียกใช้คำสั่งต่อไปนี้:
pip install pyggesterโคลนที่เก็บ: เปิดเทอร์มินัลของคุณและเรียกใช้คำสั่งต่อไปนี้เพื่อโคลนพื้นที่เก็บข้อมูล GitHub ไปยังเครื่องในพื้นที่ของคุณ:
git clone [email protected]:ValdonVitija/pyggester.gitนำทางไปยังที่เก็บ: เปลี่ยนไดเรกทอรีการทำงานของคุณเป็นที่เก็บโคลน:
cd pyggesterติดตั้ง pyggester เป็น pacakge ในพื้นที่:
[! สำคัญ] พิจารณาการทำสิ่งนี้ภายในสภาพแวดล้อมเสมือนจริง (VENV) ถ้าเป็นไปได้
pip install .สมมติว่าคุณมีไฟล์ Python เดียวที่คุณต้องการวิเคราะห์แบบไดนามิก (การวิเคราะห์รันไทม์)
ก่อนการแปลงรหัสด้วย Pyggester:
(venv) root@user: ~ /my_app > ls
app.pyเนื้อหาของ app.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.pyเนื้อหาของ app_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 (ไดเรกทอรี/repo) ที่คุณต้องการวิเคราะห์แบบไดนามิก (การวิเคราะห์รันไทม์)
ก่อนการแปลงรหัสด้วย Pyggester:
(venv) root@devs04: ~ /python_demo/app_dir > ls
__pycache__ app.py temperature.py weather.pyเนื้อหาของ app.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 ()เนื้อหาของอุณหภูมิ PY:
temperatures = list ([ 20 , 22 , 15 , 18 , 20 , 21 , 22 , 22 , 18 , 17 , 20 ])
def get_average_temperature ():
return sum ( temperatures ) / len ( temperatures )เนื้อหาของสภาพอากาศ 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_transformedเนื้อหาของ APP_DIR_TRANSFORMED/:
( venv ) root @ devs04 : ~ / python_demo / app_dir_transformed > ls
app . py temperature . py weather . pyเนื้อหาของ app.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 ()เนื้อหาของอุณหภูมิ PY:
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 )เนื้อหาของสภาพอากาศ 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.py' ที่อยู่ภายใน 'app_dir_transformed/' มั่นใจได้ว่าทุกอย่างจาก '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
ได้รับอนุญาตโดยไม่ต้องเสียค่าใช้จ่ายสำหรับบุคคลใด ๆ ที่ได้รับสำเนาซอฟต์แวร์นี้และไฟล์เอกสารที่เกี่ยวข้อง ("ซอฟต์แวร์") เพื่อจัดการในซอฟต์แวร์โดยไม่มีการ จำกัด รวมถึง แต่ไม่ จำกัด เฉพาะสิทธิ์ในการใช้สำเนาดัดแปลงผสานเผยแพร่เผยแพร่
ประกาศลิขสิทธิ์ข้างต้นและประกาศการอนุญาตนี้จะรวมอยู่ในสำเนาทั้งหมดหรือส่วนสำคัญของซอฟต์แวร์
ซอฟต์แวร์มีให้ "ตามสภาพ" โดยไม่มีการรับประกันใด ๆ ไม่ว่าโดยชัดแจ้งหรือโดยนัยรวมถึง แต่ไม่ จำกัด เฉพาะการรับประกันความสามารถในการค้าการออกกำลังกายสำหรับวัตถุประสงค์เฉพาะและการไม่เข้าร่วม ไม่ว่าในกรณีใดผู้เขียนหรือผู้ถือลิขสิทธิ์จะต้องรับผิดชอบต่อการเรียกร้องความเสียหายหรือความรับผิดอื่น ๆ ไม่ว่าจะเป็นการกระทำของสัญญาการละเมิดหรืออื่น ๆ ที่เกิดขึ้นจากหรือเกี่ยวข้องกับซอฟต์แวร์หรือการใช้งานหรือการติดต่ออื่น ๆ ในซอฟต์แวร์