62 votes

Est-ce que python a un "use strict"? et "utiliser des avertissements;" comme en perl?

J'apprends le perl et le python ... en même temps, ce n'est pas mon but mais cela doit être fait.

Question:

Dans un script Perl, j'utilise (voir ci-dessous) à la tête de mon txt.

 #!/usr/bin/env perl

use strict;
use warnings;
 

Y a-t-il quelque chose que je devrais faire en routine pour mes scripts python?

59voto

LeoNerd Points 3940

Pour fournir une réponse qui évite peut-être un peu le commentaire de bruit ici, je vais essayer un autre.

Les deux pragmata à votre question de départ vraiment l'élargir à d':

use strict "vars";
use strict "refs";
use strict "subs";
use warnings;

Pour répondre à chaque tour à tour:

  • L'effet de l' use strict "vars" est de provoquer une erreur de compilation de faire référence à une variable sans déclarer d'abord qu'il existe (comme c'est le défaut dans plus statique des langages tels que C, C++ et Java). Parce que Python n'ont pas de syntaxe pour déclarer qu'une variable existe, il n'a pas d'équivalent. L'attribution d'un nom en Python toujours la crée si elle n'existe pas en premier. Cette fonction de l' strict n'a pas d'équivalent Python et la sécurité qu'il offre ne peut pas être recréé.

Par exemple:

$ perl -c -e 'use strict "vars"; $foo = 1'
Global symbol "$foo" requires explicit package name at -e line 1.
-e had compilation errors.

$ perl -c -e 'no strict "vars"; $foo = 1'
-e syntax OK
  • L'effet de l' use strict "refs" est d'interdire l'utilisation de la plaine de chaînes de caractères contenant le nom d'un (existant ou nouveau) de la variable comme une référence à la variable elle-même. Python ne permet pas de faire cela, donc n'a pas besoin de le désactiver.

Par exemple:

$ perl -e 'use strict "refs"; ${"message"} = "hello"; print $message'
Can't use string ("message") as a SCALAR ref while "strict refs" in use at -e line 1.

$ perl -e 'no strict "refs"; ${"message"} = "hello"; print $message'
hello
  • L'effet de l' use strict "subs" est de provoquer une compilation toute tentative pour appeler une fonction qui est connu pour ne pas exister. Python n'a pas d'effectuer une telle vérification, et n'a aucun moyen d'activer cette fonctionnalité.

Par exemple:

$ perl -c -e 'use strict "subs"; foo'
Bareword "foo" not allowed while "strict subs" in use at -e line 1.
-e had compilation errors.

$ perl -c -e 'no strict "subs"; foo'
-e syntax OK
  • L'effet de l' use warnings est de permettre à plus de mises en garde à la fois de la compilation et de l'exécution des différentes catégories de comportement par défaut dans les versions antérieures, peuvent parfois être désiré, ou qui n'a jamais été une bonne idée, mais n'est pas strictement une erreur. Par exemple, l'utilisation de non initialisée valeurs des nombres doit généralement donner un avertissement, mais à l'origine il ne le fait pas.

Par exemple:

$ perl -e 'use warnings; my $u; print 2 + $u'
Use of uninitialized value $u in addition (+) at -e line 1.
2

$ perl -e 'no warnings; my $u; print 2 + $u'
2

Enfin, certaines observations ont été faites pour que Python a les mêmes fonctionnalités en __future__. Toutefois, cela ne devrait pas être considéré comme similaire à Perl pragmata, comme la plupart de ces derniers sont lexicalement d'étendue, et peut être activée ou désactivée dans de petites étendues comme l'exige; où est Python __future__ n'est activé que pour un fichier source en entier.

Par exemple.

use strict;
use warnings;

my $total;

$total += count_things($_) for @list;

{
   no warnings 'uninitialised';
   printf "The total is %d\n", $total;
}

Un peu-contrieved exemple, mais celui-ci illustre l'utilisation de l' no warnings 'uninitialised' pour désactiver l'avertissement sur l'utilisation d'une valeur non initialisée simplement à l'intérieur de l' printf déclaration, tout en gardant les autres mises en garde activé partout ailleurs.


En résumé: Python n'ont pas d' use strict ou tout près de l'équivalent de l'une des caractéristiques de sécurité sont obligatoires ou non disponibles dans le langage Python, et ne pas avoir un use warnings. Ces fonctionnalités qu'il fournit sont activés uniquement au niveau des fichiers et ne peut pas être sélectivement activée ou désactivée par portée.


Edit: en Fait j'ai été informé que Python n'ont certaines contrôlable de drapeau d'avertissement, qui peut être activé et désactivé en tant que de besoin.

10voto

Sean Points 3056

LeoNerd fournit une bonne explication pourquoi il n'y a pas de "use strict" ou "utilisation d'avertissements" en Python.

En réponse à:

Il ya quelque chose que je devrais faire une routine pour mes scripts python?

Vous pouvez être intéressé dans l'exécution de votre code grâce à un analyseur de code statique comme pylint, et/ou un format de code de vérification telles que la pep8.

Ils peuvent aider à trouver des problèmes potentiels, et le drapeau d'avertissement. Ils ont aussi beaucoup à dire sur la mise en forme de votre code, ce qui vous peut ou peut ne pas être intéressé.

Voici un décent justification de leur utilisation. Et liées Stackoverflow questions ici et ici.

10voto

Jian Points 1323

Pour exécuter Python avec les avertissements activés:

 python -W all file.py
 

En réponse à:

Y a-t-il quelque chose que je devrais faire en routine pour mes scripts python?

Je pense que c'est généralement une bonne idée de vous assurer que votre code est conforme à PEP 8 . Comme mentionné dans une autre réponse, vous pouvez le faire par programme:

 pip install pep8 && pep8 file.py
 

1voto

Lattyware Points 37257

Pas de. Python par défaut sane comportement en général, il n'ya donc pas besoin de rien en dehors de hashbang et peut-être un encodage.

Le plus proche que vous pourriez faire est de quelques importations en provenance d' __future__ dans les anciennes versions de Python pour introduire certains des correctifs ou de nouvelles fonctionnalités à partir de versions plus récentes dans les versions plus anciennes (telles que l'impression du relevé d'être remplacée par la fonction d'impression).

Edit: il me semble avoir attiré l'ire de perl les utilisateurs qui voient ce post comme une attaque sur Perl - il n'a jamais été conçu comme tel. Perl est une belle langue, c'est juste que je me sens le mouvement sensible pour une langue par défaut pour la commune de cas d'utilisation - si un programmeur est en train de faire le même standard dans chaque fichier, il ne devrait probablement pas être là. C'est le Python, et c'est la raison pour laquelle il n'y a pas d'équivalent en Python.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X