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
Member discussion