iCloudバッチを作ろう 2-(2): 複数のチェック項目をall(list)で取る
経緯・理由
- こちらを参照
目的・実装予定の機能
目的
- こちらを参照
機能
目次用記事を立てました→こちら
<< 最初の記事 | < 前の連載記事 | 次の連載記事 >
(※免責:上記の順番は記事の順番とは一致しない可能性が高いです。あらかじめご了承下さい)
今回の機能の解説
-
all(list)
で「すべてのAND」を取りたいif文を削減する - チェック内容も書きたいなら、
dict['item']=result
→all(list(dict.values()))
で取る - 応用編:
dict(key, bool)
の組み合わせで、「何に対しての条件か」を読みやすくする - 補足編:逆に「すべてにOR」をかけたいなら、
any(list)
で解決
ソースコード
「すべてのAND」を取りたいif文を削減する
すべてのAND.py
def is_file(self):
results = []
results.append(self.org_path.exists())
results.append(self.org_path.is_file())
results.append(self.file_size > 0)
return all(results)
all(list(dict.values()))を使った例
dictとall.py
def allow_file_copy(self, days_before, past_ng):
# チェック内容をdictとして記述(ログ用)
checks = {}
checks['past_ng_check'] = (not past_ng)
checks['valid_file_check'] = (self.is_file())
checks['days_range_check'] = (self.is_target_day(days_before))
# 結果のみ取り出し
results = list(checks.values())
# すべてTrueでなければ対象外
if all(results) == False:
return self.file_size
self.allow_copy = True
return self.file_size
「何に対しての条件か」を読みやすくする
応用編.py
def make_parent_dir(path_obj, sub_dir=''):
path_sub = path_obj / sub_dir
results = {}
results['parent_exist'] = path_obj.exists()
results['sub_exist'] = path_sub.exists()
if results['parent_exist']:
if not results['sub_exist']:
path_sub.mkdir(exist_ok=True)
else:
path_sub.mkdir(exist_ok=True)
path_obj = path_sub
return path_obj
書いていてようやく気付いたのですが
この場合は以下の書き方で済むので、参考までに。
応用編-修正.py
def make_parent_dir(path_obj, sub_dir=''):
path_sub = path_obj / sub_dir
if not path_sub.exists():
path_sub.mkdir(exist_ok=True)
path_obj = path_sub
return path_obj
まとめて解説
list(bool)ならそのまま、dict(key, bool)ならvalues()で取り出してから
1つめ、2つめの例のように、単にすべてのAND/ORを取るだけなら、all(list(bool))
/any(list(bool))
で取ることができます。
念のため対応表を。
チェック項目 | すべてTrue | 1個以上len(list)未満 | 0個 |
---|---|---|---|
all(list) | True | False | False |
any(list) | True | True | False |
「何に対しての条件か」を読みやすくする
上に当てはまらない、複雑な条件を書いたものが3つめの例です。
この時はdictで定義し、どの条件かをkeyで指定する形にしました。
これなら、日本語をkeyにおいても大丈夫だと思いますが、バグの温床になりそうなので、取扱いには十分ご注意を。