web-dev-qa-db-ja.com

印刷するためにrequest.GET.get()を2回書き込むのを避ける方法は?

私はPHP=バックグラウンドを持っています。Pythonでこれを行う方法があるかどうか知りたいです。

PHPでは、次のように1石で2羽の鳥を殺すことができます:

の代わりに:

_if(getData()){
    $data = getData();
    echo $data;
}
_

私がすることができます:

_if($data = getData()){
    echo $data;
}
_

getData()が存在するかどうかを確認し、存在する場合は、1つのステートメントで変数に割り当てます。

Pythonでこれを行う方法があるかどうか知りたいですか?したがって、これを行う代わりに:

_if request.GET.get('q'):
    q = request.GET.get('q')
    print q
_

request.GET.get('q')を2回記述することは避けてください。

41
givp

おそらくあなたが考えていたものとは正確には違いますが...

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

この?

25
Amber

このタスクについては、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())
25
Alex Martelli

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

これは、 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)
9
Craig McQueen
q = request.GET.get('q')
if q:
    print q
else:
    # q is None
    ...

割り当てと条件を一度に行う方法はありません...

2
Adam

PEP 572代入式を導入します。 Python 3.8以降から、次のように記述できます。

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

以下は、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]
1
timgeb

そこにないときにget()が例外をスローした場合は、

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

まあ、これは一つの方法でしょう

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

より簡潔な(しかし、何も印刷しないという呼びかけのため、優れているわけではありません)方法は

print request.GET.get('q') or '',
0
Grumdrig
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
0
louis_xv

前に変数を設定する必要なしにそれを行うための可能な方法は次のようになります:

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

..それはただの楽しみのためです-これは醜いハックであり、一見して理解するのが難しいため、この方法は使用しないでください。グローバル変数を作成/上書きします(ただし、条件が満たされた場合のみ)

0
mykhal

単に試してください:

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

最初の引数が存在しない場合、基本的に何も出力されません( dict.get )。


別の解決策は、Pythonで条件式を使用することです。

<expression1> if <condition> else <expression2>

ただし、変数を2回繰り返すことになります。次に例を示します。

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

ループ内の変数の割り当てについては、 ここ で確認してください。

0
kenorb