2016-09-03 1 views
3

J'ai un PythonScript qui commence comme ceci:matplotlib.use requis avant que les autres importations ne se heurtent à pep8. Ignorer ou réparer?

#!/usr/bin/env python 
import matplotlib 
matplotlib.use("Agg") 

from matplotlib.dates import strpdate2num 
import numpy as np 
import pylab as pl 
from cmath import rect, phase 

Il fonctionne comme un charme, mais mon éditeur se plaint: E402 module level import not at top of file [pep8].

Si je déplace le matplotlib.use("Agg") vers le bas, le script ne fonctionnera pas.

Dois-je simplement ignorer l'erreur? Ou y a-t-il un moyen de résoudre ce problème?

EDIT: Je suis conscient que pep8 dit que ce n'est une suggestion et il peut être ignoré, mais j'espère qu'il existe un bon moyen de modules sans casser initialiser directives pep8, comme je n » Je pense que je peux faire en sorte que mon éditeur ignore cette règle au cas par cas.

EDIT2: J'utilise Atom avec linter-pylama

+0

Quel éditeur utilisez-vous? Je suis certain que tous les IDE ** qui fournissent des avertissements PEP8 fournissent également une configuration sur les erreurs/avertissements à signaler et la possibilité d'ajouter des commentaires pour désactiver les avertissements/erreurs PEP8 pour des lignes/fonctions/classes spécifiques. Quoi qu'il en soit PEP8 est un guide * de style de codage *. Vous avez déjà expérimenté que suivant ce style exact, cela fait simplement que le code * ne * fonctionne pas. Donc vous n'avez pas vraiment le choix, n'est-ce pas? Le seul choix que vous avez est entre garder ces erreurs et les ignorer ou dire à votre IDE de les ignorer pour vous. – Bakuriu

Répondre

2

La solution dépend de la linter qui est utilisé.

Dans mon cas, je me sers pylama

Le manuel de ce linter suggère d'ajouter # noqa à la fin d'une ligne contenant une erreur que vous souhaitez supprimer.

D'autres linters peuvent avoir des mécanismes différents.

+2

flake8 soutient aussi ce commentaire magique! – acgtyrant

6

Apparemment, matplotlib a maintenant une fonction switch_backend():

import matplotlib.pyplot 
# import other modules 
matplotlib.pyplot.switch_backend('Agg') 

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.switch_backend

Mais méfiez-vous, vous courez le risque d'exploser:

Changer le backend par défaut. Cette fonctionnalité est expérimentale, et est seulement prévu de travailler sur un backend d'image. Par exemple, si vous avez un tas de scripts PostScript que vous voulez exécuter à partir d'une session interactive , vous pouvez basculer vers le backend PS avant de l'exécuter pour éviter d'avoir un grand nombre de fenêtres d'interface graphique. Si vous essayez de basculer interactivement d'un backend GUI à un autre, vous allez exploser . L'appel de cette commande fermera toutes les fenêtres ouvertes.

Cela fonctionne bien pour moi avec matplotlib 1.3.1 mais pas avec 1.0.0.

1

Une autre solution, pas très sympa, mais que j'ai temporairement déployée pour un environnement avec matplotlib 1.0.0, consiste à utiliser un module wrapper.

En matplotlib_agg.py:

import matplotlib 
matplotlib.use('Agg') 

Dans d'autres fichiers:

import matplotlib_agg 
# other imports 

Je ne sais pas si cela vaut la peine. Je préférerais l'ignorer dans l'éditeur; mais je ne pouvais pas obtenir celui que j'utilise (PyCharm) pour ignorer juste cette violation particulière de PEP8 E402.