如何避免两次写request.GET.get()以便打印?
我之前是做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')
。
10 个回答
10
这是对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()
用法:
if save_data(get_input()):
print save_data.value
或者如果你喜欢另一种界面:
if save_data.set(get_input()):
print save_data.get()
我觉得这个方法在测试一系列正则表达式时很有用,特别是在使用if-elif-elif-elif等结构时,就像在这个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)
26
你可以在这里查看我8年前写的这个任务的做法:这里。
# 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())
24
可能不是你想的那样,但是...
q = request.GET.get('q')
if q:
print q
这样吗?