LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

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においても大丈夫だと思いますが、バグの温床になりそうなので、取扱いには十分ご注意を。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0