3 min read

ronBureau : Python

Python

Gestionnaire d'environment virtuel

  • DEPENDENCY HELL!!!
  • pyproject.toml

poetry

Installation et mise à jour

Linux :

curl -L https://install.python-poetry.org | python3 - # --uninstall : désintallation
poetry --version
#+>~/.bashrc
export PATH="/home/ron/.local/bin:$PATH"
source ~/.bashrc  # ou source ~/.zshrc
# VSCode: VScode chargeur `.bashrc` une seule fois quand VSCode démarrer pour tout les terminal. Il faut obligatoirement redémarrer VSCode

Windows :

(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -

Utilisation

poetry new -i <projet-nom>
poetry init
poetry init --no-interaction
poetry add <package-nom>+^version* # dernier de même version majeure
poetry add <package-nom>+~version* # dernier de même version mineur
poetry install
poetry show <package-nom>* 
eval $(poetry env activate) # en Poetry 2.0, il faut éxécuter le sortie comme `source /home/ron/.cache/pypoetry/virtualenvs/ronzz-tool-CMyy2PWF-py3.12/bin/activate` manuellement
poertry version minor
poertry publish
poetry add debugpy --dev

Deboggae

# debug.py
import debugpy

# Configure le port pour le débogueur
debugpy.listen(("localhost", 5678))
print("Le débogueur est prêt et attend une connexion sur le port 5678.")

# Attendre que le client de débogage se connecte
debugpy.wait_for_client()

# Importer et exécuter votre application principale
import main

main.main()
// .vscode/launch.JSON
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Déboguer avec Poetry",
            "type": "debugpy",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "cwd": "${workspaceFolder}",
            "env": {
                "POETRY_VIRTUALENVS_CREATE": "true",
                "POETRY_VIRTUALENVS_IN_PROJECT": "true"
            },
            "envFile": "${workspaceFolder}/.env",
            "python": "${workspaceFolder}/.venv/bin/python"
        },
        {
            "name": "Attach to Debugpy",
            "type": "debugpy",
            "request": "attach",
            "connect": {
                "host": "localhost",
                "port": 5678
            },
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}",
                    "remoteRoot": "."
                }
            ]
        }
    ]
}
py debug.py
# Puis démarrer déboggae en VSCode (F5)

venv (ancien)

# Assurez vous ête en la dossier de projet
python3 -m venv .

Ensuite gestionnaire les paquets:

source bin/activate
pip <nom-de-package>
pip install pip-autoremove
pip-autoremove <nom-de-package>

Chaque fois vous ouvertez une nouvelle terminal, il faut d'abord source bin/activate.

linting

pipx install ruff

⭐Astuce: VSCode-Puis utiliser emeraldwalk.runonsave pour la démarrer automatiquement sur sauvegarder.

linting en VSCode

charliermarsh.ruff

"[python]": {
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
    "source.fixAll": "explicit"
    },
    "editor.defaultFormatter": "ms-python.black-formatter"
}
  • Organize Imports
    • imports non utilisé sont automatiquement supprimé
    • utiliser nouveau imports avant sauver la fichier à nouveau!

Grammaire

Syntaxes succincts

output_dir = input(" ") or "."
uuids = [rec.get("UUID") for rec in self.records if rec.get("UUID")]
actions = [
            {
                "icon": "assets/icons/play.png",
                "tooltip": "Lire l'audio/vidéo (Alt+A)",
                "color": "#b3e5fc",
                "callback": lambda: self.play_media(media_path),
            },
            {
                "icon": "assets/icons/favorite.png",
                "tooltip": "Favori (Alt+F)",
                "color": "#ffd700",
                "callback": lambda: self.mark_as_favorite(entry_uuid),
            },
            {
                "icon": "assets/icons/error.png",
                "tooltip": "Signaler une erreur (Alt+E)",
                "color": "#c14a6c",
                "callback": lambda: self.report_error(entry_uuid),
            },
            {
                "icon": "assets/icons/check.png",
                "tooltip": "Vérifier les réponses (Alt+C)",
                "color": "#4CAF50",
                "callback": lambda: self.check_multiple_responses_dialog(
                    responses, None
                ),
            },
            {
                "icon": "assets/icons/refresh.png",
                "tooltip": "Actualiser (Alt+R)",
                "color": "#4f4dc9",
                "callback": lambda: (
                    self.refresh_records_from_db(),
                    self.display_next_item(),
                ),
            },
            {
                "icon": "assets/icons/skip.png",
                "tooltip": "Sauter (Alt+K)",
                "color": "#e0e0e0",
                "callback": self.skip_current_entry,
            },
            {
                "icon": "assets/icons/save.png",
                "tooltip": "Sauvegarder le progrès (Alt+S)",
                "color": "#3bb67d",
                "callback": self.save_records_to_custom_file,
            },
        ]
        shortcut_map = {
            "Alt+A": 0,  # Play
            "Alt+F": 1,  # Favori
            "Alt+E": 2,  # Erreur
            "Alt+C": 3,  # Vérifier
            "Alt+R": 4,  # Actualiser
            "Alt+K": 5,  # Sauter
            "Alt+S": 6,  # Sauvegarder
        }
        buttons = []
        for idx, action in enumerate(actions):
            btn = QPushButton()
            btn.setIcon(QIcon(action["icon"]))
            btn.setIconSize(QSize(48, 48))
            btn.setFixedSize(64, 64)  # Taille augmentée
            btn.setToolTip(action["tooltip"])
            btn.setStyleSheet(
                f"background-color: {action['color']}; border-radius: 8px; margin: 6px;"
            )
            btn.clicked.connect(action["callback"])
            self.actions_layout.addWidget(btn)
            buttons.append(btn)
        # Ajout explicite des QShortcut pour chaque action
        for keyseq, idx in shortcut_map.items():
            if idx < len(actions):
                shortcut = QShortcut(QKeySequence(keyseq), self)
                shortcut.activated.connect(actions[idx]["callback"])

Class

class dogs:

    dog_count: int = 0
    dog_names_list: list = []

    def __init__(self, name: str, age: str):
        self.name = name
        self.age = age
        self.__class__.dog_count += 1
        self.__class__.dog_names_list.append(name)
    

    def remind_feed_dog(self):      # dynamique et a besoin d'un objet
        return f"it's time to feed {self.name}"

    @staticmethod
    def hello():         # juste pour organisation, identique que les fonctionne indépendent
        print('Hello!')

    @classmethod
    def dog_info(cls):        # static mais peut-ëtre accéder les variables générale de class
        return cls.dog_count, cls.dog_name_list

Fonctionne anonyme

lambda {arguments}: {expression}
# Utilisation avec map pour doubler chaque élément d'une liste
numbers = [1, 2, 3, 4]
doubled = list(map(lambda x: x * 2, numbers))
print(doubled)  # Affiche [2, 4, 6, 8]

Gérez les erruers

try:
    pyperclip.copy(
        selected_app_id
    )  # Utiliser pyperclip comme solution de secours
    print(
        f"appId '{selected_app_id}' copié dans le presse-papier avec pyperclip."
    )
except Exception as pyperclip_error:
    print(
        f"Erreur lors de la copie dans le presse-papier avec pyperclip : {pyperclip_error}"
    )
finally:
    print("done. ✨ 🌟 ✨")  # Fermer correctement l'application