### 問題: 手続きを定義しなさい。引数には `method`と`path`を受け取る。 `method` は `GET`, `POST`, `HEAD`, `PUT`などの文字列である。 path は `/` から始まる任意の文字列である。 (`"/"` だけの場合もありうる) 返り値は `[status, contents]` からなるリスト/配列とする。 `status`は`"200 OK"`, `"404 NotFound"`などの文字列である。 `contents`は、method, path の関係ごとに紐付けられた文字列である 以下の要件を満たすように実装せよ。 ``` GET "/hello" → ("200 OK", "こんにちは") GET "/bye" → ("200 OK", "さよなら") POST "/bye" → ("200 OK", "ばいばい") 該当なし → ("404 NotFound", "ないです") ``` 処理とデータは可能な限り分離せよ。 `if (path == "/hello") 〜 elseif (path == "/bye")`のように、条件文にマジックナンバーが含まれるコードは望ましくない。 ## 回答 ```python def procedure(method,path): methods={'GET':1,'POST':2} paths={'/hello':1,'/bye':2} if method not in methods: if path not in paths: return ['404 NotFound','ないです'] result=['200 OK'] post=False if methods[method]==2: post=True if paths[path]==2 and not post: result.append('さよなら') elif paths[path]==2 and post: result.append('ばいばい') else: result.append('こんにちわ') return result GET "/hello" → ("200 OK", "こんにちは") GET "/bye" → ("200 OK", "さよなら") POST "/bye" → ("200 OK", "ばいばい") 該当なし → ("404 NotFound", "ないです") routes = { "/hello": { "GET": "200 OK", "こんにちは", } "/bye": { "GET": ("200 OK", "さよなら"), "POST": ("200 OK", "ばいばい"), } } if (method, path) in routes: else return ("404 NotFound", "ないです") assert procedure("POST", "/hello") == ['404 NotFound','ないです'] ```