iCloudバッチを作ろう 2-(2): 複数のチェック項目をall(list)で取る

iCloudバッチを作ろう 2-(2): 複数のチェック項目をall(list)で取る

経緯・理由

目的・実装予定の機能

目的

機能

目次用記事を立てました→こちら

<< 最初の記事 | < 前の連載記事 | 次の連載記事 >

(※免責:上記の順番は記事の順番とは一致しない可能性が高いです。あらかじめご了承下さい)

今回の機能の解説

  • all(list)で「すべてのAND」を取りたいif文を削減する
  • チェック内容も書きたいなら、dict['item']=resultall(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においても大丈夫だと思いますが、バグの温床になりそうなので、取扱いには十分ご注意を。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.