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 .