207 votes

Quelle est la façon standard de faire un no-op en python ?

Je me retrouve souvent à écrire des constructions if / elif / else en python, et je veux inclure des options qui peuvent se produire, mais pour lesquelles l'action correspondante est de ne rien faire. Je me rends compte que je pourrais simplement exclure ces instructions if, mais pour des raisons de lisibilité, je trouve qu'il est utile de les inclure toutes, de sorte que si vous regardez le code, vous pouvez voir ce qui se passe à la suite de chaque option. Comment coder le no-op ? Actuellement, je le fais comme ceci :

no_op = 0

if x == 0:
    y = 2 * a
elif x == 1:
    z = 3 * b
elif x == 3:
    no_op

(Le code est en fait un peu plus long que cela, et plus compliqué. Ceci est juste pour illustrer la structure).

Je n'aime pas utiliser une variable comme un no-op, mais c'est le meilleur moyen auquel j'ai pensé. Y a-t-il un meilleur moyen ?

1 votes

Cette ellipse ( ... ) mérite également d'être mentionné : stackoverflow.com/a/6189281/38281

373voto

Brian R. Bondy Points 141769

Utilisez passer pour le no-op :

if x == 0:
  pass
else:
  print "x not equal 0"

Et voici un autre exemple :

def f():
  pass

Ou :

class c:
  pass

3 votes

En une phrase, j'utilise doSQL = lambda *x:x .

3 votes

Vous pourriez utiliser "None" à la place de "pass" mais cela ne clarifie pas le code.

0 votes

Est-ce que cela est supporté pour les opérations ternaires, en particulier dans le cas de else ?

29voto

kotlinski Points 12815

Et si pass ?

25voto

Andrew Wagner Points 1958

Si vous avez besoin d'une fonction qui se comporte comme un nop, essayez

nop = lambda *a, **k: None
nop()

Je fais parfois ce genre de choses lorsque je rends les dépendances facultatives :

try:
    import foo
    bar=foo.bar
    baz=foo.baz
except:
    bar=nop
    baz=nop

# Doesn't break when foo is missing:
bar()
baz()

2 votes

Il s'agit d'une bonne solution de contournement lorsque l'on a besoin de l'option nop dans un contexte qui requiert spécifiquement une expression (par opposition à une déclaration arbitraire ; q.v. docs.python.org/3/reference/simple_stmts.html y docs.python.org/3/reference/compound_stmts.html ) - comme par exemple en tant que sous-expression d'un idiome de code existant tel qu'une compréhension, ou un lambda ou (Dieu nous en préserve) une chaîne de caractères à passer dans le fichier eval(…) (que q.v. docs.python.org/3/library/functions.html#eval si vous le devez).

2 votes

Utilisation de lambda Assigner une fonction à une variable pour la réutiliser est un mauvais style de codage. Il y a def pour ça.

6voto

Douglas Leeder Points 29986

Pour les références de l pass voir la commande : http://www.network-theory.co.uk/docs/pytut/passStatements.html

2voto

Bengt Points 2327

Vous pouvez imprimer une chaîne vide et sans saut de ligne sur la sortie standard. Cela peut être pratique si un linter vous interdit d'utiliser une chaîne de caractères de type pass où c'est inutile, mais vous avez besoin d'une ligne pour un commentaire :

print('', end='')  # This does next to nothing

En utilisant ce vide print a très peu d'effets secondaires, à part le gaspillage de cycles de CPU :

$ echo "print('', end='')  # This does next to nothing" > main.py
$ python3 main.py
$ 

Notez que l'utilisation de pass ici aurait été syntaxiquement correct, mais les linters pourraient se plaindre :

$ echo "pass  # This does next to nothing" > main.py
$ python3 main.py
$

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