最近社内のpythonツールの修正を改善したく、実装してみました。
すると、はまったとか気づいたことがありますので、忘れないようそして他の方の参考になれるようにこの記事に書くようにします。
勉強になった点
int型でファイルへの書き込みはできない
pythonは変数定義の際に型の指定は必要ないが、method呼び出す際に型がチェックされることがあると今回のことでわかりました。
書き込みは以下のコードで実現しています。
filePath = {ファイルのパス}
pageNoFile = open(filePath, 'w')
pageNoFile.write(pageCount)
pageNoFile.close()
pageNoみたいな数字をファイルに書き込むと以下のエラーになります。
TypeError: write() argument must be str, not int
pageCountが数字とかのint型である場合、以下のようにstring型に変換できます。
str(pageCount)
文字列と数値は結合できない
例えば以下のコードです。
toGetComponentURL = url + pageCount
urlは文字列で、pageCountは数字です。この二つを結合する場合、以下のエラーが発生します。
TypeError: can only concatenate str (not "int") to str
同様にstring型に変換する必要があります。
print()みたいに型変換不要なケースもありますが、型変換が必要なケースが多いというのを知りました。
jsonにある要素が空であるかチェック
今回のケースはjsonにあるcomponentsのmapがあるかをチェックしたいです。
以下のように書けばよいのです。([]を使う)
jsonObj["components"] == []
再帰的な処理を書く際にreturn書くのを忘れないで
今回の処理は結果が出なくなるまでAPIを呼び出し続けて、最大ペース数を取得する処理を書こうとしました。
以下のようにもともと書きました。
def get_max_page_no(pageCount) :
toGetComponentURL = url + paramPageSize + str(pageSize) + paramPerPage + str(pageCount)
req = urllib.request.Request(toGetComponentURL)
with urllib.request.urlopen(req) as res:
jsonObj = json.loads(res.read().decode('utf8'))
if (jsonObj["components"] == []) :
pageCount = pageCount - 1
return pageCount
else :
pageCount = pageCount + 1
get_max_page_no(pageCount)
すると、後続の処理でエラーが起きて、調べてみたらpageCountがうまく生成されず、Noneになりました。
もうタイトルでネタバレしたのですが、elseのところにreturnしなければいけないのです。
else :
pageCount = pageCount + 1
return get_max_page_no(pageCount)
その他
VscodeでPythonの開発がしやすい
元々はpythonを自端末でインストールし、セットアップをやって、batファイルから実行する、もしくはJenkinsジョブからpythonコードを実行するというのをやりました。
今回は初めてvscodeで直接コードを実行しました。
セットアップはかなり簡単で、Vscodeにpythonの拡張機能を追加すれば、pythonコードを実行できます。
デバッグもできて、かなり使いやすかったのでお勧めです!
最後に
数時間で書いたコードですが、いろんなエラーに遭遇して勉強になりました。
皆さんの参考にもなれれば幸いです。