I come from a PHP background and would like to know if there\'s a way to do this in Python.
In PHP you can kill 2 birds with one stone like this:
Instead of
a possible way to do it, without necessity to set the variable before, could be like:
if (lambda x: globals().update({'q':x}) or True if x else False)(request.GET.get('q')):
print q
.. it's just for fun - this method should not be used, because it is ugly hack, difficult to understand at first sight, and it creates/overwrites a global variable (only if the condition is met, though)
Well, this would be one way
q = request.GET.get('q')
if q:
print q
A briefer (but not superior, due to the call to print of nothing) way would be
print request.GET.get('q') or '',
See my 8-year-old recipe here for just this task.
# 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())
PEP 572 introduces Assignment Expressions. From Python 3.8 and onwards you can write:
if q := request.GET.get('q'):
print q
Here are some more examples from the Syntax and semantics part of the PEP:
# Handle a matched regex
if (match := pattern.search(data)) is not None:
# Do something with match
# A loop that can't be trivially rewritten using 2-arg iter()
while chunk := file.read(8192):
process(chunk)
# Reuse a value that's expensive to compute
[y := f(x), y**2, y**3]
# Share a subexpression between a comprehension filter clause and its output
filtered_data = [y for x in data if (y := f(x)) is not None]