How to avoid writing request.GET.get() twice in order to print it?

前端 未结 10 737
名媛妹妹
名媛妹妹 2020-12-04 21:34

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

相关标签:
10条回答
  • 2020-12-04 22:30

    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)

    0 讨论(0)
  • 2020-12-04 22:33

    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 '',
    
    0 讨论(0)
  • 2020-12-04 22:38

    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())
    
    0 讨论(0)
  • 2020-12-04 22:39

    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]
    
    0 讨论(0)
提交回复
热议问题