💡

Python初心者が「なるほど」と思った実装について

2023/09/05に公開

はじめに

去年の11月から業務でPythonを書き始めました。
いまのチームにメッチャPythonを書ける人がいて、いろいろレビュー指摘をもらって勉強になったので同じくPython初心者の人、これから学ぶ人、それ以外のPython書いてる人、自分用のメモも兼ねて公開したいと思います。

クラス名はパスカル、定数は大文字スネーク、それ以外は小文字スネークケース

VS CodeならPylintやflake8などのプラグインを導入していると、キャメルケースで変数を定義している箇所を警告してくれます。
いままでずっとキャメルで書いてきたからついキャメルで書いてしまう…。
(eの一文字とかでも警告されて煩わしい部分もありますが…)
参考コード規約pep8

1行80文字未満(79文字まで)

これもPylintやflake8で警告してもらえます。
いまいるプロジェクトだと単体テストについては80文字以上でも指摘されてないです。
1行の文字数が決まってるの昔のプロジェクトっぽいですね。
参考コード規約pep8

文字リテラルの使用は最低限にする

例えば辞書型の変数に配列を格納する際、何度も文字リテラルで辞書にアクセスするのではなく一度で済ませるようにします。

# こうではなく、
hoge['fuga'].append('pon1')
hoge['fuga'].append('pon2')
hoge['fuga'].append('pon3')
# こう書く
fugas = []
fugas.append('pon1')
fugas.append('pon2')
fugas.append('pon3')
hoge = {'fuga': fugas}

これはJavaScriptとかでもそうかもしれないです。

辞書型の変数から値を取得する際にキーが存在しない可能性がある場合は.getを使用する

DynamoDBから取得したレコードを操作する際に指定したキーが存在しない可能性があるため、 hoge['key'] ではなく hoge.get('key') のように取得します。
キーが存在しない場合はNoneが返ってきます。
hoge.get('key', '空') とすればNoneのかわりに空という文字列が返ってきます。

辞書に何回もアクセスするなら変数に入れる

hoge.get('code') と何度も書くのなら、 code = hoge.get('code') として code を使用します。

空チェックなどで戻り値にBool値を返す際は三項演算子ではなくnotを使う

return False if ret is None else True ではなく return not ret とすればNoneや空のときにFalseが返ります。

Bool値の評価はis False、not hogeなどを使う

つい hoge == True と書きたくなるが、 hoge is True を使います。
Falseかどうかの判定なら if not hoge: とします。

辞書の値がふたつとも存在するか確認したい時

以下のように書きます。

if (hoge.get('fuga') and hoge.get('pon')):

ただし、レビューで以下の認識だったと言われました。
(直さなくても上記のコードでレビュー通ったけど…)

if not (hoge.get('fuga') is None and hoge.get('pon') is None):

こっちの書き方の方が冗長的で、否定の否定だから読みづらいと思ったのは私だけ?
教えてPython得意な人。

ちなみに最初は以下のように書いてました。

if hoge.get('fuga') is not None and hoge.get('pon') is not None:

ふたつの変数がNoneかどうかの判定する際のnotはまとめられる

最初は以下のように書いてましたが、

if any(hoge) == False or hoge.get('fuga') is None:

以下のように書けます。

if not (any(hoge) and hoge.get('fuga')):

辞書から配列を取り出す際にデフォ値を指定しておけばNoneチェック不要

2023/09/06追記

辞書から配列を取り出してなにか操作(特定の値の有無チェックとか)したい場合、取り出す際にデフォ値としてから配列を指定しておけばNoneチェックは不要になります。

具体的にはこういうコードが、

array = hoge.get('fuga')
if not array:
  return

if target not in array:
  return

こうなります。

array = hoge.get('fuga', [])
if target not in array:
  return

最後に

他にもいくつかあったのですが、プロジェクト固有の指摘もあったのでこのあたりにしておきます。
他に一般的な話としてタイポチェックなどもプラグインでできるのでVS Code便利ですね。
業務ではクラウドIDE使わないといけなくてチェックするときだけVS Codeに貼り付けてチェックしてるのが悲しい…。
VS Codeからリモート接続できるらしいけど、今の環境でいけるかどうか。。

他にも勉強になりそうな指摘があったら追記するかもです。

Discussion