
Pyggester - (Python + Sugchester) fungiert sowohl als dynamischer als auch als statischer Analysator. Sein Hauptzweck besteht darin, Vorschläge anzubieten, um die Effizienz des Python -Codes zu verbessern, indem die suboptimale Verwendung von Datenstrukturen angesprochen wird.
Pyggester bietet eine ziemlich anständige CLI -Schnittstelle für seine Funktionen. Die CLI ist auf Typer gebaut
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. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Die Pyggester CLI enthält zwei unterschiedliche Merkmale:
Statische Analyse: Dieses Merkmal untersucht Ihren Code umfassend, ohne ihn auszuführen, und bietet aufschlussreiche Einblicke in seine Struktur und potenzielle Verbesserungen.
Execution command
[! Anmerkung] Der 'statische' Unterbefehl existiert, hat jedoch keine Funktionen implementiert, da wir bereits gute statische Analysatoren haben (Pylinint, Ruff, Flake8). Sollten wir in zukünftigen Iterationen Vorschläge identifizieren, die durch statische Analyse festgelegt werden können, werden wir sie in dieses Merkmal einbeziehen.
pyggest staticDynamische/automatische Transformation: Diese Funktion fügt Ihren Python -Dateien zusätzlichen Code hinzu, um Ihre Datenstrukturen zur Laufzeit zu analysieren. Ihr ursprünglicher Code bleibt gleich; Es wird nicht geändert. Es wird eine neue Datei erstellt, die genau dem Original entspricht, aber mit zusätzlichem Code. Dies funktioniert sowohl für einzelne Dateien als auch für ganze Verzeichnisse (vollständige Projektstrukturen).
Execution command
pyggest transform[! Info] Pyggester bietet eine integrierte Dokumentation für eine detaillierte Verwendung an
pyggest transform --help
pyggest static --help # NOT IMPLEMENTEDSie können die Python -Bibliothek einfach mit PIP installieren. Öffnen Sie Ihr Terminal und führen Sie den folgenden Befehl aus:
pip install pyggesterKlonen Sie das Repository: Öffnen Sie Ihr Terminal und führen Sie den folgenden Befehl aus, um das Github -Repository auf Ihre lokale Maschine zu klonen:
git clone [email protected]:ValdonVitija/pyggester.gitNavigieren Sie zum Repository: Ändern Sie Ihr Arbeitsverzeichnis in das geklonte Repository:
cd pyggesterInstallieren Sie Pyggester als Pacakge lokal:
[! WICHTIG] Überlegen Sie, ob dies in einer virtuellen Umgebung (Venv) möglich ist.
pip install .Nehmen wir an, Sie haben eine einzige Python-Datei, die Sie dynamisch analysieren möchten (Laufzeitanalyse).
Vor der Code -Transformation mit Pyggester:
(venv) root@user: ~ /my_app > ls
app.pyInhalt von 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 ))Wichtig
Stellen Sie sicher, dass Sie sich in einer virtuellen Umgebung befinden, da Pyggester vor dem nächsten Schritt installiert ist.
(venv) root@devs04: ~ /my_app > pyggest transform app.py
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ File transformed successfully ! │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯(venv) root@devs04: ~ /my_app > ls
app.py app_transformed.pyInhalt von 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 ()Wichtig
Wir haben jetzt eine neue Datei, die automatisch erstellt wurde, die die Originaldatei widerspiegelt. Diese neue Datei enthält alle Inhalte des Originals sowie zusätzlichen Code zur Analyse Ihres Codes während der Laufzeit. Anstatt das Original "app.py" auszuführen, sollten Sie jetzt 'app_transformed.py' ausführen. Seien Sie versichert, alles von 'app.py' ist in 'app_transformed.py' beibehalten.
(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 │
╰────────────────────────────────────────────────────────────────────────────╯Nehmen wir an, Sie haben ein Python-Projekt (Verzeichnis/Repo), das Sie dynamisch analysieren möchten (Laufzeitanalyse)
Vor der Code -Transformation mit Pyggester:
(venv) root@devs04: ~ /python_demo/app_dir > ls
__pycache__ app.py temperature.py weather.pyInhalt von 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 ()Temperaturgehalt.Py:
temperatures = list ([ 20 , 22 , 15 , 18 , 20 , 21 , 22 , 22 , 18 , 17 , 20 ])
def get_average_temperature ():
return sum ( temperatures ) / len ( temperatures )Wetterinhalte.py:
weather_conditions = [ 'Sunny' , 'Rainy' , 'Cloudy' , 'Windy' , 'Sunny' , 'Cloudy' ]
def get_weather ( city ):
return weather_conditions . pop ()Wichtig
Stellen Sie sicher, dass Sie sich in einer virtuellen Umgebung befinden, da Pyggester vor dem nächsten Schritt installiert ist.
(venv) root@devs04: ~ /python_demo > pyggest transform app_dir/
Enter the name of the main file: app.py
╭──────────────────────────────────────────────────────────────────────────╮
│ Directory transformed successfully ! │
╰──────────────────────────────────────────────────────────────────────────╯Wichtig
Wenn ein Verzeichnis oder ein Projekt als Argument angegeben wird, fordert uns Pyggester auf, die Hauptdatei unseres Projekts anzugeben. Diese Datei sollte der Einstiegspunkt Ihres Projekts sein, der unter ihrem Dateinamen angegeben ist.
(venv) root@devs04: ~ /python_demo > ls
app_dir app_dir_transformedInhalt von app_dir_transformed/:
( venv ) root @ devs04 : ~ / python_demo / app_dir_transformed > ls
app . py temperature . py weather . pyInhalt von 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 ()Temperaturgehalt.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 )Wetterinhalte.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 ()Wichtig
Wir haben jetzt ein neues Verzeichnis, das automatisch erstellt wurde, das das ursprüngliche Verzeichnis widerspiegelt. Dieses neue Verzeichnis enthält alle Inhalte des Originals sowie zusätzlichen Code für die Analyse Ihres Codes während der Laufzeit. Anstatt das ursprüngliche "app.py" auszuführen, sollten Sie jetzt 'app.py' ausführen, das sich in 'app_dir_transformed/' befindet. Seien Sie versichert, alles von 'app_dir' ist in 'app_dir_transformed/' beibehalten.
(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.pyDas folgende Durchflussdiagramm zeigt Schlüsselkomponenten von Pyggester und bietet einen umfassenden Überblick über die Ausführungssequenz.

Um zu diesem Projekt beizutragen, finden Sie in den umfassenden Beitragshandbuch für detaillierte Anweisungen und Best Practices.
MIT -Lizenz
Copyright (C) 2023 Valdonvitijaaa
Die Erlaubnis wird hiermit einer Person, die eine Kopie dieser Software und zugehörigen Dokumentationsdateien (der "Software") erhält, kostenlos erteilt, um die Software ohne Einschränkung zu behandeln, einschließlich ohne Einschränkung der Rechte, zu verwenden, zu kopieren, zu modifizieren, zusammenzufassen, zu veröffentlichen, zu veröffentlichen, zu verteilen, zu verteilt, und/oder Kopien der Software zu ermöglichen, um Personen zu beanstanden, an denen die Software zugänglich ist, um die folgenden Bedingungen zu beantragen.
Die oben genannte Copyright -Mitteilung und diese Erlaubnisbekanntmachung müssen in alle Kopien oder wesentlichen Teile der Software enthalten sein.
Die Software wird "wie es ist" ohne Garantie jeglicher Art, ausdrücklich oder stillschweigend bereitgestellt, einschließlich, aber nicht beschränkt auf die Gewährleistung der Handelsfähigkeit, die Eignung für einen bestimmten Zweck und die Nichtverletzung. In keinem Fall sind die Autoren oder Urheberrechtsinhaber für Ansprüche, Schäden oder andere Haftungen haftbar, sei es in einer Vertragsklage, unerbittlich oder auf andere Weise, die sich aus oder im Zusammenhang mit der Software oder anderen Geschäften in der Software ergeben.