Pythonのウォルラス(セイウチ)演算子の挙動について教えてください。
(Pythonバージョン:3.9)
発生している事象
下記のコードにおいて、13行目の
if (result := get_batches(check.get(name, 0)))
の箇所をカッコを外し、
if result := get_batches(check.get(name, 0))
とすると、シンタックスエラーが発生します。
なぜカッコでくくらないといけないのでしょうか。
Python
1#リストitemsをキーとして辞書checkの値を確認する。 2#50以上であれば、辞書foundに格納する。 3check = { 4 'A': 100, 5 'B': 80, 6 'C': 40, 7} 8items = ['A', 'B', 'E'] 9 10def get_batches(count): 11 return count // 50 12 13x = {name: result for name in items 14 if (result := get_batches(check.get(name, 0)))} 15print(x)
調べたこと
ウォルラス演算子の左辺にある変数「result」に対し、さらに何かの演算子を使用したいのあれば、カッコが必要であることは理解できます。
たとえば以下のような場合です。
#例1 if (result := get_batches(check.get(name, 0))) Is None #例2 if (result := get_batches(check.get(name, 0))) == 10
この例であれば、「result」への代入を終えた後に、さらに演算子を使用するためにカッコを使うことは理解できます。
しかし、今回はそうしたケースではありません。
「では、ウォルラス演算子をifで使用する場合は、何かと比較をしていなくてもカッコでくくらないといけないというルールが実はあるのか?」
と思い、調べてみましたがそうしたルールは見当たりませんでした。
実際、公式ドキュメントでもウォルラス演算子の項では以下のコードがありました。これはやはりカッコでくくられていません。
if matching := pattern.search(data): do_something(matching)
また、「内包表記の内部でウォルラス演算式を使用する場合は、通常必要ないカッコが必要になるのか?」
とも思いましたが、こちらもそうしたルールは見当たりませんでした。
初歩的すぎる質問で恥ずかしながら自分の知識では、
if (result := get_batches(check.get(name, 0)))
の箇所をカッコを外し、
if result := get_batches(check.get(name, 0))
としたとき、何が原因でシンタックスエラーになってしまっているか理解できずにいます。
どなたか詳しい方ご教示いただけますと幸いです。
よろしくお願いいたします。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/07/28 07:36
2023/07/28 07:38
2023/07/30 06:28