Подтвердить что ты не робот

Как избежать записи 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') дважды.

4b9b3361

Ответ 1

Вероятно, не совсем то, о чем вы думали, но...

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

Ответ 2

Смотрите мой 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 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())

Ответ 3

Вариант Alex 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 и т.д., как в этом вопросе 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)

Ответ 4

q = request.GET.get('q')
if q:
    print q
else:
    # q is None
    ...

Невозможно выполнить назначение и условные условия за один раз...

Ответ 5

Если get() выдает исключение, если оно не существует, вы можете сделать

try:
   q = request.GET.get('q')
   print q
except :
   pass

Ответ 6

Ну, это будет один из способов

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

Брайфер (но не выше, из-за вызова печати ничего) будет

print request.GET.get('q') or '',

Ответ 7

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

Ответ 8

возможный способ сделать это, без необходимости устанавливать переменную раньше, может быть следующим:

if (lambda x: globals().update({'q':x}) or True if x else False)(request.GET.get('q')):
    print q

.. это просто для удовольствия - этот метод не должен использоваться, потому что он является уродливым взломом, который трудно понять с первого взгляда, и он создает/перезаписывает глобальную переменную (только если условие выполнено)

Ответ 9

Просто попробуйте:

print(request.GET.get('q', ''))

который в основном ничего не печатает, если первый аргумент отсутствует (см. dict.get).


Альтернативным решением было бы использовать условное выражение в Python:

<expression1> if <condition> else <expression2>

но вы в конечном итоге повторяете переменную дважды, например:

print(request.GET.get('q') if request.GET.get('q') else '')

Для переменных назначений в циклах, проверьте здесь.