.. sectionauthor:: Nicolas Perrier

.. _Pycharm: https://www.jetbrains.com/pycharm/
.. _Subclipse: http://subclipse.tigris.org/
.. _subversion: http://subversion.tigris.org/
.. _pylint: http://www.logilab.org/857

======
 PyCharm
======

Pycharm_ est un environnement complet qui permet le développement de projets Python.


Notions
=======
.. index:: module

===========
Les modules
===========

Le code python peut être sauvegardé dans des *modules*. Un module est un objet chargé dans l'interpréteur à partir d'un fichier texte. L'extension du fichier est habituellement *.py*

L'importation de module s'effectue par la directive *import*, l'importation d'un module s'effectue tout d'abord en recherchant dans le répertoire courant, puis dans les répertoires spécifiées dans le PYTHONPATH et enfin dans le répertoire d'installation de Python.

Différentes façons d'importer

::
  
  import module
  from module import element1, element2...
  from module import element1 as elem1

.. index:: package

===========
Les paquets
===========

Les paquets (package) constituent un deuxième niveau d'organisation, il s'agit de répertoires contenant des modules.
Un répertoire est considéré comme un paquet si il contient un fichier __init__.py

======================
Conventions de nommage
======================

 - Modules et paquets: mots courts, tout en minuscules avec des "soulignés" pour séparateur.
 - Classes: règle "CapWord", i.e., des mots à la suite avec une majuscule pour chaque.
 - Variables et functions: mots courts, tout en minuscules avec des "soulignés" pour séparateur.
 
 https://www.python.org/dev/peps/pep-0008/
 
 - Pour automatiser les contrôles d'écriture : black et flake8 (installation dans pycharm)
 


Installation
============
L'installation du plugin Pycharm s'éffectue depuis l'exécutable ou le package proposé sur le site internet.


Configuration
=============

L'ensemble des configurations de Pycharm est accessible via: :menuselection:`Window --> Preferences`

.. image:: _images/preferences_pycharm.png
  :alt: Pycharm préférences
  :scale: 35 %

Configuration de l'interpréteur python
--------------------------------------

Commençons par préciser le chemin de l'interpréteur python: :menuselection:`Window --> Preferences --> Project: session expert`

Sélectionnez l'interpreteur, Pycharm s'occupe d'ajouter dans son path l'ensemble des librairies présentes dans l'installation du python.

.. image:: _images/interpreteur.png
  :alt: Ecran de configuration du python path dans pycharm
  :scale: 35 %



Configuration de l'éditeur
--------------------------
Dans la fenêtre des préférences choisissez :menuselection:`Window  --> Preferences --> Editor` 

Dans l'onglet **Code Style**, assurez vous bien que les tabulations sont bien sur 4 cases.

De cette façon, lors de l'utilisation de la touche tabulation dans l'editeur, 4 espaces seront générés, ce qui est le standard Python.

.. image:: _images/conf_editor.png
  :alt: Ecran de configuration de l'éditeur de Pycharm
  :scale: 35 %

Toujours dans la fenêtre des préférences, allez dans :menuselection:`Window  --> Preferences --> Editor --> File Encodings` et assurez vous là encore
que l'encodage proposé est bien **"utf-8"**.

Création d'un nouveau projet
============================

Dans la barre des menus aller dans :menuselection:`File --> New Project`

.. image:: _images/nouveau_projet.png
  :alt: Ecran de configuration de l'éditeur de Pycharm
  :scale: 35 % 

Dans cette fenêtre, précisez:

- l'emplacement du dossier (qui fera le nom du projet);
- l'interpréteur parmi ceux connus ou à retrouver via l'emplacement du binaire **python**.

Le fonctionnement interne de Pycharm nécessite de définir un dossier comme *dossier des sources*. Tout package ou module à l'intérieur de ce dossier sera ajouté automatiquement au PYTHON_PATH.

Si d'autres projets ont été créés il est possible de déclarer des projets référencés, i.e. des projets dépendants. Le chemin des projets dépendants sera alors ajoutés automatiquement au PYTHON_PATH.

Conclure en cliquant sur *Create*.

Le projet est maintenant présent dans le panneau *Project*.

Création d'un package
=====================

Nous allons maintenant créér un nouveau package (dossier dans l'espace de nommage python pour regrouper des modules).

Allez dans :menuselection:`File --> New -->Python Package`. Précisez le nom du paquet.

.. image:: _images/create_package.png
  :alt: Ecran de création d'un package 

Concluez en cliquant sur le bouton *Ok*.

Pycharm a créé un dossier contenant le fichier __init__.py. Nous avons donc bien un package.
  
.. image:: _images/package_created.png
  :alt: Panneau de navigation, présence du package créé
  
Création d'un module
====================

Créons maintenant à l'intérieur de ce package un module python (python file).

Aller dans :menuselection:`File --> New --> Python File`.

.. image:: _images/python_module.png
  :alt: Ecran de création d'un package
  :scale: 35 % 

Précisez:

- le nom du module;
- le type (cas des fichiers pour les tests unitaires).

.. image:: _images/info_module.png
  :alt: Ecran de création d'un package
  :scale: 35 % 

Concluez en cliquant sur le bouton *Ok*.

Le module ainsi créé est visible dans le package.

Éléments graphiques de l'éditeur
================================

Pour découvrir les fonctionnalités de Pycharm nous allons écrire la classe **Acteur** qui modélise un acteur.
Un acteur possède un nom.


.. literalinclude:: ./_class/acteur.py


L'écriture de cette classe aura permis de découvrir certaines fonctionnalités de l'éditeur.

- **Coloration syntaxique**:La coloration syntaxique de l'éditeur est une des premières fonctionnalités à apporter dans un environnement de développement.
  Il est possible de modifier les couleurs utilisées dans les préférences de Pycharm :menuselection:`Window --> Preferences --> Editor` et modifiez les couleurs qui ne vous conviennent pas.

- **Indentation**: L'éditeur facilite la position du curseur en ajoutant automatiquement les espaces nécessaires, après la définition d'une classe par exemple. 
  Le code sélectionné peut facilement  être indenté ou désindenté grâce aux touches Tab et Shift + Tab.

- **Gestion des commentaires**: Il est parfois utile de commenter ou de décommenter toute une portion de code et rien n'est plus rébarbatif que d'ajouter ou supprimer le fameux # devant chaque ligne.
  Pycharm utilise une combinaison pour commenter/décommenter l'ensemble du code sélectionné.

- Surbrillance des éléments jumelés: Plus connue sous la dénomination anglaise de *matching brackets highlighting*, elle permet par un moyen visuelle de repérer facilement le partenaire d'un élément jumelé.
  Dans l'éditeur de Pycharm l'élément jumelé, un crochet ouvrant par exemple, est encadré de bleu quand le curseur se trouve sur son élément fermant.


- **Correction syntaxique** : Le souligné rouge signale toute erreur de syntaxe, le passage du curseur provoque l'apparition d'une infobulle dans laquelle l'erreur est expliquée.

.. image:: _images/erreur_syntaxe.png
  :alt: Correction d'une erreur de syntaxe

Console python interactive
==========================

Pour lancer la console python interactive, cliquez sur l'onglet *python console* situé en bas de l'interface.

.. image:: _images/python_console.png
  :alt: Ecran console python
  :scale: 50 % 

La console python possède de nombreuses fonctionnalités (complétion de code, auto import...)

**Exercice** : Depuis cette console, créez votre premier acteur. ::

    >>> from acteur import Acteur
    >>> johnClesse = Acteur('John Cleese')
    >>> johnClesse.get_nom_acteur()
    'John Cleese'  
    >>> johnClesse
   'Acteur: John Cleese'
 
Utilisation du déboggeur
========================

Le manuel sur Pycharm : http://confluence.jetbrains.com/display/PYH/Debugger

La première phase à effectuer est d'ajouter un *breakpoint* dans votre code. 

Dans l'éditeur, choisissez la ligne de code où démarrer le debugger et simple cliquez à sa gauche. 
Le breakpoint est signalé visuellement par une petite boule rouge.

.. image:: _images/point_arret.png
  :alt: Créer un point d'arrêt

Lancez ensuite l'exécution de votre module en choisissant l'icône *deboggeur*. 

.. image:: _images/lancer_debugger.png
  :alt: Ecran du debugger





   