Bonjour,
Je débute en Python, et j'aimerais explorer les subtilités du langage.
Dans le code suivant je veut lister tout les processus dont les noms correspondent à plusieurs critères.
J'ai trouvé deux façons de faire et je me demande s'il n'y a pas une façon plus élégante, optimal ou concise… ou, différente.
#!/bin/env python
from sys import exit
import psutil
procs=['gnome',
'chrom']
def isRunning(x):
for proc in procs:
if x.name().find(proc) != -1: return(True)
def test1():
for p in filter(isRunning , psutil.process_iter()):
print((p.name(),p.pid))
def test2():
for p in psutil.process_iter():
for proc in procs:
if p.name().find(proc)!=-1: print((p.name(),p.pid))
def main():
test1()
test2()
return(0)
if __name__ == "__main__":
exit(main())
# Éléments de réponses
Posté par GuieA_7 (site web personnel) . Évalué à 6.
return
.p.name().find(proc)!=-1
serait plus pythonique avec un simpleproc in p.name()
Au final tes 2 versions se valent pour un petit script ; après si tu écris beaucoup de code, tu voudras peut-être limiter le code boiler plate. Mais ça dépend de la tête de ton code et de ton imagination.
Si tu passes ton temps à itérer sur les processus dont tu filtres le nom, tu pourrais par exemple faire un générateur:
Et si tu veux faire du beaucoup de filtrage et selon des critères variés, tu pourrais imaginer une API qui permettrait d'écrire des choses comme (inspiration Django):
[^] # Re: Éléments de réponses
Posté par R. Danell Olivaw . Évalué à 1.
Merci,
J'aime bien le mot pythonique ; canonique mais en python.
Du coup je suis parti sur ta seconde proposition avec le générateur.
# Retour booléen
Posté par lolop (site web personnel) . Évalué à 4.
Un commentaire sur ton
isRunning()
.Si ta fonction trouve le processus, elle retourner un booléen
True
.Si le processus n'est pas trouvé elle ne fait pas de
return
, donc Python retourneNone
… même s'il est vrai qu'en cas d'utilisation dans un cast implicite vers booléens ça vaudraFalse
, il serait mieux que ta fonction retourne explicitementFalse
lorsque le processus n'est pas trouvé.Accessoirement, ça peut éviter de se retrouver à manipuler des valeurs non booléennes là où on en attendait:
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
[^] # Re: Retour booléen
Posté par R. Danell Olivaw . Évalué à 1.
Merci pour le commentaire, en effet les cast implicite ne sont pas l'idéal.
La fonction
any
que je viens de découvrir permet d'éviter ce désagrément.Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.