Comment éviter d’écrire request.GET.get () deux fois pour l’imprimer?

Je viens d’un fond PHP et je voudrais savoir s’il y a un moyen de faire cela en Python.

En PHP, vous pouvez tuer 2 oiseaux avec une pierre comme ceci:

Au lieu de:

if(getData()){ $data = getData(); echo $data; } 

Je peux le faire:

 if($data = getData()){ echo $data; } 

Vous vérifiez si getData() existe ET si c’est le cas, vous l’assignez à une variable dans une instruction.

Je voulais savoir s’il y a un moyen de faire cela en Python? Donc, au lieu de faire ceci:

 if request.GET.get('q'): q = request.GET.get('q') print q 

évitez d’écrire deux fois request.GET.get('q') .

Probablement pas exactement ce que vous pensiez, mais …

 q = request.GET.get('q') if q: print q 

ce?

Voir ma recette de 8 ans ici pour cette tâche.

 # In Python, you can't code "if x=foo():" -- assignment is a statement, thus # you can't fit it into an expression, as needed for conditions of if and # while statements, &c. No problem, if you just structure your code around # this. But sometimes you're transliterating C, or Perl, or ..., and you'd # like your transliteration to be structurally close to the original. # # No problem, again! One tiny, simple utility class makes it easy...: class DataHolder: def __init__(self, value=None): self.value = value def set(self, value): self.value = value; return value def get(self): return self.value # optional but handy, if you use this a lot, either or both of: setattr(__builtins__,'DataHolder',DataHolder) setattr(__builtins__,'data',DataHolder()) # and now, assign-and-set to your heart's content: rather than Pythonic while 1: line = file.readline() if not line: break process(line) # or better in modern Python, but quite far from C-like idioms: for line in file.xreadlines(): process(line) # you CAN have your C-like code-structure intact in transliteration: while data.set(file.readline()): process(data.get()) 

Une variation sur la réponse d’Alex :

 class DataHolder: def __init__(self, value=None, attr_name='value'): self._attr_name = attr_name self.set(value) def __call__(self, value): return self.set(value) def set(self, value): setattr(self, self._attr_name, value) return value def get(self): return getattr(self, self._attr_name) save_data = DataHolder() 

Usage:

 if save_data(get_input()): print save_data.value 

ou si vous préférez une autre interface:

 if save_data.set(get_input()): print save_data.get() 

Je trouverais cela utile pour tester une série d’expressions régulières dans une construction if-elif-elif-elif etc, comme dans cette question SO :

 import re input = u'test bar 123' save_match = DataHolder(attr_name='match') if save_match(re.search('foo (\d+)', input)): print "Foo" print save_match.match.group(1) elif save_match(re.search('bar (\d+)', input)): print "Bar" print save_match.match.group(1) elif save_match(re.search('baz (\d+)', input)): print "Baz" print save_match.match.group(1) 
 q = request.GET.get('q') if q: print q else: # q is None ... 

Il n’y a aucun moyen de faire des affectations et des conditionnels en une fois …

Si get () lance une exception quand il n’y en a pas, vous pouvez le faire

 try: q = request.GET.get('q') print q except : pass 

Eh bien, ce serait une façon

 q = request.GET.get('q') if q: print q 

Un moyen plus court (mais pas supérieur, dû à l’appel à l’impression de rien) serait

 print request.GET.get('q') or '', 
 config_hash = {} tmp_dir = ([config_hash[x] for x in ["tmp_dir"] if config_hash.has_key(x)] or ["tmp"])[0] print tmp_dir config_hash["tmp_dir"] = "cat" tmp_dir = ([config_hash[x] for x in ["tmp_dir"] if config_hash.has_key(x)] or ["tmp"])[0] print tmp_dir 

un moyen possible de le faire, sans avoir à définir la variable auparavant, pourrait être:

 if (lambda x: globals().update({'q':x}) or True if x else False)(request.GET.get('q')): print q 

.. c’est juste pour le fun – cette méthode ne devrait pas être utilisée, car elle est un hack moche, difficile à comprendre à première vue, et crée / écrase une variable globale (seulement si la condition est remplie)

Essayez simplement:

 print(request.GET.get('q', '')) 

ce qui n’imprime rien si le premier argument n’est pas présent (voir dict.get ).


Une solution alternative consisterait à utiliser une expression conditionnelle en Python:

  if  else  

mais vous finirez par répéter deux fois la variable, par exemple:

 print(request.GET.get('q') if request.GET.get('q') else '') 

Pour les affectations de variables dans les boucles, archivez ici .