57255


Json形式のデータを読み込んで、あるvalueの値がリストの値と同じだった場合は'PASS'の文字列をリストにappendし、異なる場合は'FAIL'の文字列をリストにappendして、最終的にそれらの結果をリストでreturnするプログラムを実装したいです。

[code]

    import json
    from pprint import pprint
    
    json_list = {"batfish_result": [
            {
                "Action": {
                    "0": "DENY"
                },
                "Line_Content": {
                    "0": "no-match"
                }
            },
    
           {
                "Action": {
                    "0": "PERMIT"
                },
                "Line_Content": {
                    "0": "permit    10.20.0.0 255.255.255.0"
    
           }
      }
    ]
                }
    
    
    def main(json_list):
        PASS = "PASS"
        FAIL = "FAIL"
        result = {}
        result_list = []
        action_num_list = []
        condition_list = ["permit", "permit"]
    
        jsons = json_list["batfish_result"]
    
        for j in jsons:
            action = j['Action']
            action_num = action["0"]
            action_num_list.append(action_num)
            #[DENY, PERMIT]
    
        for con in condition_list:
             con = con
    
        #for action in action_num_list:
        for x, y in zip(condition_list, action_num_list):
    
            if pprint(y) == pprint(x.upper()):
    
                result_list.append(PASS)
                result['msg'] = result_list
    
            #if pprint(y) != pprint(x.upper()):
            else:
    
                result_list.append(FAIL)
                result['msg'] = result_list
    
        return result_list
    
    main(json_list)
    
[/code]

上記のように実装したのですが結果は以下のようになりました。

[code]

    'DENY'
    'PERMIT'
    'PERMIT'
    'PERMIT'
    ['PASS', 'PASS']
    
[/code]

'DENY'と'PERMIT'が読み込まれているのでこの二つはifには該当せず、elifに行きそこで'FAIL'の文字列がリストにappendされるはずなのですがなぜか'PASS'になってしまいます。

どこが間違っていますでしょうか。


CC BY-SA 4.0
2019-08-08T13:38:21.327
57253
2019-08-08T14:30:59.353
35402
question
python python3
なぜelif文でフィルタリングできていないのか

[code]

    if pprint(y) == pprint(x.upper()):
    
[/code]

としている部分を

[code]

    if y == x.upper():
    
[/code]

に変えてみてください。

一般に`pprint`のように副作用(この場合は画面への出力)が主な機能であるような関数は返り値を持たないことも多いですが、Pythonで`return`を省略、または引数のない`return`を書くと`None`を返します。[ソース](https://github.com/python/cpython/blob/3.6/Lib/pprint.py)を見ると分かるのですが、実際`pprint`にも`return`がなく、`None`を返すことが分かります。

[code]

    In [1]: import pprint as pp
    
    In [2]: print(pp.pprint("abc"))
    'abc'
    None
    
[/code]

さらに`None`同士は等しいと判定されるので`if`の条件は常に`True`となります。

[code]

    In [4]: pp.pprint("abc") == pp.pprint("123")
    'abc'
    '123'
    Out[4]: True
    
[/code]


CC BY-SA 4.0
2019-08-08T14:30:59.353
57255
2019-08-08T14:30:59.353
13199
57253
answer