python toolz 3 curry, unittest.mock.patch

先端技術開発部の三谷です。

python toolz 1

で紹介しました curry について、
丁度業務で使用して便利なことがありましたので、ここで追記していこうと思います。

functoolsのpartialでもありますが、
こちらは デコレータによって、関数のカリー化を行いやすくなっています。

業務では、次のようなことがありました。

  • AWS Lambda内のスクリプトを引っ張り出して、ツールとして利用したい。
  • このスクリプト内でboto3.client を呼んでいるが、ツール内ではaccess_key と secret_keyを指定して呼びたい

この引数に、access_keyとsecret_keyを足す。

  • AWS Lambdaにデプロイするスクリプトなので、元スクリプトに不用意な変更を入れたくない。が、Lambdaの修正にツールも追従させる。

これを解決する方法は色々あると思いますが、次のような手段を取りました。

  • ツールセットアップ時に、Lambda 内の一部を引っ張り出す。-> lambda_tool
  • 引っ張り出したスクリプトを利用するスクリプトを用意する。 その中でunittest.mock.patchを利用して、引っ張り出すスクリプト内の呼び出し関数(lambda_tool.get_client)にパッチを充てる。

結果としは、以下のようになりました。

get_client(access_key, setret_key) でカリー化した関数を取得し、 それをunittest.mock.patchのside_effectに登録しました。
これで、lambda_tool.get_client(‘XXX’) の呼び出しが、 get_client(‘XXX’, access_key, secret_key) となります。

関数のカリー化と、unittestのmock.patchについて紹介いたしました。