408 votes

Comment utiliser l’instruction passe en Python

Donc, je suis en train d’apprendre python et je suis arrivé à la section sur l’instruction de pass. Du guide que j’utilise, il est défini comme étant une déclaration de valeur Null qui est couramment utilisée comme espace réservé.

Je ne comprends toujours pas pleinement ce que cela signifie bien que... Quelqu'un peut-il me montrer une situation de base/simple où l’instruction pass serait utilisée et pourquoi il est nécessaire ?

487voto

sebastian_oe Points 948

Supposons que vous créez une nouvelle classe avec certaines méthodes que vous ne voulez pas mettre en œuvre, encore.

Si vous laisserait le `` , le code ne serait pas exécuté.

Vous obtiendrez alors un

Pour résumer, le `` énoncé n’a aucun effet particulier mais peut agir comme un espace réservé, comme indiqué avant.

234voto

Anaphory Points 903

Python a la syntaxe de l'exigence que les blocs de code (après if, except, def, class etc.) ne peut pas être vide. Vide les blocs de code sont cependant utiles dans une variété de contextes différents, comme dans les exemples ci-dessous, qui sont les plus fréquents des cas d'utilisation que j'ai vu.

Par conséquent, si rien n'est censé arriver dans un bloc de code, pass est nécessaire pour qu'un tel bloc de produire un SyntaxError. Sinon, toute déclaration (y compris juste un terme qui doit être évalué, comme l' Ellipsis littérale ... ou une chaîne de caractères, le plus souvent une docstring) peut être utilisé, mais l' pass fait clair que, de fait, rien n'est censé arriver, et n'a pas besoin d'être évalués et (au moins temporairement) stockées dans la mémoire.

  • Ignorant (en tout ou) un certain type d' Exception (exemple de l' xml):

    try:
        self.version = "Expat %d.%d.%d" % expat.version_info
    except AttributeError:
        pass # unknown
    

    Remarque: en Ignorant tous les types de pose, comme dans l'exemple suivant d' pandas, est généralement considéré comme une mauvaise pratique, car elle attrape aussi des exceptions qui devraient probablement être transmis à l'appelant, par exemple, KeyboardInterrupt ou SystemExit (ou même HardwareIsOnFireError – Comment savez-vous que vous n'êtes pas en cours d'exécution sur une boîte personnalisée avec des erreurs spécifiques définies, dont certaines application appelante voudrions le savoir?).

    try:
        os.unlink(filename_larry)
    except:
        pass
    

    Au lieu d'utiliser au moins except Error: - ou, dans ce cas, de préférence, except OSError: est considérée comme bien meilleure pratique. Une analyse rapide de l'ensemble des modules python j'ai installé m'a donné que plus de 10% de la except ...: pass états attraper toutes les exceptions, il est donc encore un fréquent motif de programmation python.

  • Dériver une classe d'exception qui n'ajoute pas de nouveaux comportements (par exemple, en scipy):

    class CompileError(Exception):
        pass
    

    De même, les classes conçu comme classe de base abstraite souvent explicite vide __init__ ou d'autres méthodes qui sous-classes sont censés tirer. (par exemple, pebl)

    class _BaseSubmittingController(_BaseController):
        def submit(self, tasks): pass
        def retrieve(self, deferred_results): pass
    
  • Les tests que ce code s'exécute correctement pour quelques valeurs de test, sans se soucier des résultats (à partir de mpmath):

    for x, error in MDNewton(mp, f, (1,-2), verbose=0,
                             norm=lambda x: norm(x, inf)):
        pass
    
  • Dans la classe ou dans la définition d'une fonction, souvent une docstring est déjà en place, comme la déclaration obligatoire d'être exécuté en tant que la seule chose dans le bloc. Dans de tels cas, le bloc peut contenir pass de plus à la docstring pour dire "C'est en effet destiné à ne rien faire.", par exemple, en pebl:

    class ParsingError(Exception): 
        """Error encountered while parsing an ill-formed datafile."""
        pass
    
  • Dans certains cas, pass est utilisé comme un espace réservé à dire "Cette méthode/classe/si-bloc/... n'a pas encore été mis en œuvre, mais ce sera l'endroit pour le faire", même si personnellement je préfère l' Ellipsis littérale ... afin de distinguer strictement entre le présent et le intentionnelle "no-op" dans l'exemple précédent. Par exemple, si j'écris un modèle à grands traits, je pourrais écrire

    def update_agent(agent):
        ... 
    

    là où d'autres auraient

    def update_agent(agent):
        pass
    

    avant

    def time_step(agents):
        for agent in agents:
            update_agent(agent)
    

    comme un rappel pour remplir l' update_agent fonction à un moment plus tard, mais faire quelques tests déjà pour voir si le reste du code se comporte comme prévu. (Une troisième option, pour ce cas, est - raise NotImplementedError. Ceci est utile en particulier pour les deux cas: Soit "Cette méthode abstraite doit être mis en œuvre par chaque sous-classe, il n'y a pas de méthode générique permettant de définir dans cette classe de base", ou "Cette fonction, avec ce nom, n'est pas encore implémenté dans cette version, mais c'est ce que sa signature va ressembler")

23voto

John Peyton Points 266

En plus de son utilisation comme un espace réservé pour les fonctions non implémentées, pass peut être utile en remplissant un if-else ("Explicite est mieux qu'implicites.")

def some_silly_transform(n):
    # Even numbers should be divided by 2
    if n % 2 == 0:
        n /= 2
        flag = True
    # Negative odd numbers should return their absolute value
    elif n < 0:
        n = -n
        flag = True
    # Otherwise, number should remain unchanged
    else:
        pass

Bien sûr, dans ce cas, on ne serait probablement utiliser return au lieu d'affectation, mais dans les cas où la mutation est souhaitable, ce qui fonctionne le mieux.

L'utilisation de l' pass est ici particulièrement utile pour prévenir les futurs responsables (y compris vous-même!) ne pas mettre étapes redondantes à l'extérieur des instructions conditionnelles. Dans l'exemple ci-dessus, flag est définie dans les deux spécifiquement mentionné des cas, mais pas dans l' else-cas. Sans l'aide d' pass, un futur programmeur peut déplacer flag = True à l'extérieur de l'état-ainsi, flag dans tous les cas.


Un autre cas est avec le standard de la fonction souvent vus au fond d'un fichier:

if __name__ == "__main__":
    pass

Dans certains dossiers, il peut être bon de laisser de qui il avec pass pour faciliter le montage plus tard, et à rendre explicite le fait que rien n'est susceptible de se produire lorsque le fichier est exécuté sur son propre.


Enfin, comme mentionné dans d'autres réponses, il peut être utile de ne rien faire lorsqu'une exception est interceptée:

try:
    n[i] = 0
except IndexError:
    pass

19voto

Schilcote Points 289

La meilleure et la plus précise de la façon de penser de la pass est aussi un moyen d'indiquer explicitement à l'interprète de ne rien faire. De la même manière le code suivant:

def foo(x,y):
    return x+y

signifie "si j'appelle la fonction foo(x, y), la somme des deux nombres les étiquettes x et y représentent la main et le résultat en retour",

def bar():
    pass

signifie "Si j'appelle la fonction bar(), qui ne font absolument rien."

Les autres réponses sont tout à fait correct, mais il est également utile pour quelques choses qui n'impliquent pas de lieu-tenant.

Par exemple, dans un peu de code que j'ai travaillé sur tout récemment, il a été nécessaire de diviser deux variables, et il est possible pour le diviseur de zéro.

c = a / b

pourra, bien évidemment, de produire un ZeroDivisionError si b est égal à zéro. Dans cette situation particulière, en laissant de c sous zéro a été le comportement désiré dans le cas que b était de zéro, j'ai donc utilisé le code suivant:

try:
    c = a / b
except ZeroDivisionError:
    pass

Un autre, moins standard d'utilisation est aussi un endroit très pratique pour placer un point d'arrêt pour votre débogueur. Par exemple, je voulais un peu de code pour percer dans le débogueur, le 20 itération d'un... dans l'énoncé. Donc:

for t in range(25):
    do_a_thing(t)
    if t == 20:
        pass

avec le point d'arrêt sur pass.

6voto

dm03514 Points 20748

Si vous ne savez pas ce que vous allez mettre dans un certain code bloc

J’aime l’utiliser lorsque déraciner les tests trop. J’ai souvent fois suis conscient de ce que je voudrais tester, mais ne ' sais pas trop comment faire. Exemple de test ressemble à ce que sebastian_oe a suggéré

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