如何避免为了打印而两次写入request.GET.GET()?

2024-09-28 17:02:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我来自一个PHP背景,想知道是否有一种方法可以在Python中做到这一点。

在PHP中,你可以像这样一石二鸟:

而不是:

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

我可以做到:

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

检查getData()是否存在,如果存在,则在一个语句中将其赋给变量。

我想知道在Python中是否有这种方法?所以不要这样做:

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

避免写request.GET.get('q')两次。


Tags: 方法echodatagetifrequest语句中将
3条回答

关于这个任务,请看我8岁的食谱here

# 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())

Alex's answer上的变体:

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()

用法:

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

或者,如果您喜欢其他接口:

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

我认为这有助于测试if-elif-elif-elif etc构造中的一系列正则表达式,如this SO question

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

这个?

相关问题 更多 >