Python初心者が「なるほど」と思った実装について
はじめに
去年の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