Edited at

オレオレPythonコードスニペット集

随時更新


ワンライナーちっくなの


環境変数の利用

環境変数に定義してあればその値を利用して、なければデフォルト値を設定する。

サンプルは環境変数dryrunがあればその値をboolのTrue/Falseに変換し、なければFalseを設定する。

import os

from distutils.util import strtobool
dryrun = strtobool(os.environ['dryrun']) if 'dryrun' in os.environ else False


リスト生成

セミコロン区切りのhostsを分解して、値があるものだけでリストを作る。

前後の空白は取り除く。

results = [host.strip() for host in hosts.split(';') if not host.strip() == '']


文字列操作

文字列置換

'cp conf/env-%(stage)s.conf %(release)s/settings.conf' % {

'release': env.current_release,
'stage': env.stage
}

Python3.6以上なら

f'cp conf/env-{env.current_release}.conf {env.stage}/settings.conf'


よく使う処理


スクリプト化

#!/usr/bin/env python


def main():
print('hoge')

if __name__ == '__main__': main()


日付系

JSTで1日前

from datetime import datetime, timedelta, timezone

JST = timezone(timedelta(hours=+9), 'JST')
yesterday = datetime.now(JST) + timedelta(days=-1)

YYYYMMDD形式の文字列をdatetimeへ変換

from datetime import datetime

yyyymmdd_datetime = datetime.strptime("20190321", '%Y%m%d')

datetimeを文字列化

date_str = datetime.now(JST).strftime('%Y%m%d')


月の操作

datetimeでmonthが操作できないのでdateutil.relativedeltaを使う。

dateutilを使うためにpython-dateutilをインストール

$ pip install python-dateutil

17ヶ月前の月頭(1日)にする場合

from dateutil.relativedelta import relativedelta

from datetime import datetime, timedelta, timezone

JST = timezone(timedelta(hours=+9), 'JST')

today = datetime.now(JST)
before_seventeenth_month = today + relativedelta(months=-17)
start_date = before_seventeenth_month.replace(day=1)


ファイル操作

ディレクトリの削除(エラーは無視)

import shutil

shutil.rmtree('ディレクトリパス', ignore_errors=True)


boto3

SNSのMessage部分を取る方法

event['Records'][0]['Sns']['Message']


Lambda


eventパラメータチェック

キーがあればその値、なければデフォルト値を使う。

ignore_folders = []

if 'ignore_folders' in event and type(event['ignore_folders']) is list:
ignore_folders = event['ignore_folders']


関数系


コンフィグファイルローダー

特定箇所にあるコンフィグファイルを読み込む。

configディレクトリまでの階層によって、場所指定は適時変える。

以下はconfig/とsrc/utils/config.pyの階層構造を想定した場合。

https://docs.python.jp/3/library/configparser.html


config.py

# -*- coding:utf-8 -*-

import os
import configparser

def get_config(config_file_name):
"""
configディレクトリ配下のコンフィグファイルをロードして返却する

Parameters
----------
config_file_name : str
ファイル名

Returns
-------
SafeConfigParser
ロードしたコンフィグ情報
"""
config_path = os.path.join(
os.path.dirname(__file__), '../../config/' + config_file_name)
config = configparser.SafeConfigParser()
config.read(config_path, encoding='utf8')

return config



設定系


flake8の定義ファイル

コードチェック用


.flake8

[flake8]

ignore = D203, E401, E265
exclude =
.git,
__pycache__,
bin,
lib,
build,
dist
max-line-length = 120


VSCode

venv環境を認識させる


.vscode/settings.json

{

"python.pythonPath": "bin/python3"
}


pythonでのテスト実行

デフォルトだとtest_ほげほげ.pyをテストとして見るので、パターンが違う場合は-pで指定する

python -m unittest discover tests

python -m unittest discover -p "*_test.py" tests

サブディレクトリまでは見ないので、そういう場合はこんな感じのことをするらしい

https://qiita.com/yoichi22/items/2b488dc0696d9b45fad6


テストのスキップ

import unittest

class SampleTest(unittest.TestCase):

@unittest.skip('スキップ理由などのコメント')
def test_add_number_plus_double(self):
pass



ナレッジ(おまけ)

Pythonでコーディングしてた際に詰まったところやナレッジのまとめ。