python - peticiones - ¿Cómo evitar escribir request.GET.get() dos veces para imprimirlo?
requests get python 3 (9)
Vengo de un fondo de PHP y me gustaría saber si hay una manera de hacerlo en Python.
En PHP puedes matar 2 pájaros de un tiro así:
En lugar de:
if(getData()){
$data = getData();
echo $data;
}
Puedo hacer esto:
if($data = getData()){
echo $data;
}
Verifica si getData()
existe Y si lo hace, lo asigna a una variable en una declaración.
Quería saber si hay una manera de hacer esto en Python. Entonces, en lugar de hacer esto:
if request.GET.get(''q''):
q = request.GET.get(''q'')
print q
evite escribir request.GET.get(''q'')
dos veces.
Bueno, esto sería una manera
q = request.GET.get(''q'')
if q:
print q
Una manera más breve (pero no superior, debido a la llamada a la impresión de nada) sería
print request.GET.get(''q'') or '''',
Probablemente no sea exactamente lo que estabas pensando, pero ...
q = request.GET.get(''q'')
if q:
print q
¿esta?
Si get () arroja una excepción cuando no está allí, podrías hacer
try:
q = request.GET.get(''q'')
print q
except :
pass
Simplemente intente:
print(request.GET.get(''q'', ''''))
que básicamente no imprime nada si el primer argumento no está presente (ver dict.get
).
Una solución alternativa sería usar una expresión condicional en Python:
<expression1> if <condition> else <expression2>
pero terminarás repitiendo la variable dos veces, por ejemplo:
print(request.GET.get(''q'') if request.GET.get(''q'') else '''')
Para asignaciones variables en bucles, ingrese here .
Una variación en la respuesta de 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()
Uso:
if save_data(get_input()):
print save_data.value
o si prefiere una interfaz alternativa:
if save_data.set(get_input()):
print save_data.get()
Me parece útil para probar una serie de expresiones regulares en una construcción if-elif-elif-elif, como en esta pregunta 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)
Vea mi receta de 8 años here solo para esta tarea.
# 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())
una posible forma de hacerlo, sin necesidad de establecer la variable antes, podría ser como:
if (lambda x: globals().update({''q'':x}) or True if x else False)(request.GET.get(''q'')):
print q
.. es solo por diversión - este método no debe usarse, porque es un hack feo, difícil de entender a primera vista, y crea / sobrescribe una variable global (solo si se cumple la condición)
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
q = request.GET.get(''q'')
if q:
print q
else:
# q is None
...
No hay forma de hacer asignaciones y condicionales de una vez ...