質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

3回答

4150閲覧

[Python3] nullチェックをきれいに書く方法を教えてください

cray123

総合スコア47

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/04/13 06:33

編集2019/04/13 07:13

pythonで文字列が0のとき、Noneのとき、dict形式のkeyが無いときに引っ掛けるif文を作ったのですが、もう少し短く書く方法は無いでしょうか

# 以下のパターンを引っ掛けたい dic = {"hello": "hello"} dic = {"test": ""} dic = {"test": " "} dic = {"test": None} # このif文をきれいに書きたい # dic['test']がNoneの場合エラーになる if 'test' in dic and len(dic['test']) == 0 and dic['test'] is not None : test = dic['test'] # 追記 if 'test' in dic and dic['test'] is not None and len(dic['test']) == 0 : test = dic['test'] else: print("error")

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Noneが入っているのが最大の問題だと思いますが、
短く書きたいなら

python

1if (dic.get('test') or '').strip(): 2 ... 3else: 4 ... # こっちがエラー

でしょうかね。

短く書かないほうが読みやすいケースだと思いますけれども。


https://docs.python.org/ja/3/reference/expressions.html#boolean-operations

a or bを評価すると、aが真値ならaと、偽値ならbとなります。
dic.get('test')で、キーがなくてNoneになるか、Noneや空文字がとりだされたときはorの右の空文字で評価されます。

投稿2019/04/13 07:35

編集2019/04/13 11:04
quickquip

総合スコア11038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cray123

2019/04/13 08:14

ご回答ありがとうございます。 確かに短く書くことで可読性が損なわれる場合もあるみたいですね.. 参考にさせていただきます また、この書き方も初めて見るのですが、どのような評価が行われているのでしょうか それについて解説のある参考サイトでもいいので教えていただけると嬉しいです
guest

0

if dic.get('test') == '': とかですかね。

######get(key[, default])

key が辞書にあれば key に対する値を、そうでなければ default を返します。 default が与えられなかった場合、デフォルトでは None となります。そのため、このメソッドは KeyError を送出することはありません。

引用元:Python 標準ライブラリ » 組み込み型 - マッピング型 --- dict

コメントを受けて

dic = {"hello": "hello"}

dic = {"test": ""}
dic = {"test": " "}
dic = {"test": None}
挙げているdicのパターンはすべてerrorにしたいです

条件が複雑で面倒なので、判定用の関数を用意しましょう。

Python

1def is_valid_dic(dic): 2 if 'test' not in dic: 3 return False 4 5 value = dic['test'] 6 if value is None: 7 return False 8 9 if value.strip() == '': 10 return False 11 12 return True

あるいは辞書を作るとき、空白のみの文字列を書き込まずにNoneを使うようにしても良いです。
これなら if not dic.get('test'): で済みます。

投稿2019/04/13 06:39

編集2019/04/13 07:19
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cray123

2019/04/13 06:51

ご回答ありがとうございます。 ` if not dic.get('test') in {None, '', ' '} ` としたら短くかけそうですね!
LouiS0616

2019/04/13 06:52

それだと元のコードと真偽変わっちゃいませんか? - testをキーに持ち - その要素が空文字列である という条件では無かったのですか?
cray123

2019/04/13 07:01 編集

やりたかった判定は以下ですが ・dicに'test'キーが存在しない場合 ・要素がNoneの場合 ・要素のlengthが0の場合  ・要素がスペースの場合 先のコードだと問題があるということでしょうか?
LouiS0616

2019/04/13 07:03

ええと、 dic = {"hello": "hello"} dic = {"test": ""} dic = {"test": " "} dic = {"test": None} どれがokでどれがerrorなんですか? 元のコードだと error/ok/error/実行時例外 だったのですが。
cray123

2019/04/13 07:09 編集

すみません 書き方が悪かったようです 挙げているdicのパターンはすべてerrorにしたいです
cray123

2019/04/13 07:14 編集

今気づいたのですが、質問に書いた dic['test'] is not None をif文の最後に書いているのでdic['test']がNoneだった場合にもlen()を取得してしまうので例外になるようです スペースの場合の考慮も漏れてますね...
LouiS0616

2019/04/13 07:16

一行で書くなら if 'test' not in dic or dic['test'] is None or dic['test'].strip() == '': ですけれど、読めたものでは無いので追記したような関数を噛ませた方が良いでしょう。
cray123

2019/04/13 07:21

追記ありがとうございます strip()で空白を削除して比較というのは思いつきませんでした。 ご提示いただいた関数も参考にさせていただきます
cray123

2019/04/13 07:32

ちなみに if not dic.get('test') in {None, '', ' '} では問題があるのでしょうか?
LouiS0616

2019/04/13 07:36 編集

複数空白がある場合に対応できません。 dic = {'test': '空白 空白 空白'} とか。
cray123

2019/04/13 08:11

たしかにそうですね!! ありがとうございます
guest

0

こうですかね。

python

1item = dic.get("test") 2if item and item.strip(): 3 test = item 4else: 5 print("error")

これは

python

1item = dic.get("test") 2if (item is not None) and (item.strip() != ""): 3 test = item 4else: 5 print("error")

とだいたい同じです。

投稿2019/04/13 07:32

編集2019/04/13 07:47
tachikoma

総合スコア3601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cray123

2019/04/13 08:12

ありがとうございます 前者の書き方は知らなかったです 左辺と右辺でどのような評価が行われているのでしょうか それについて解説のある参考サイトでもいいので教えていただけると嬉しいです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問