https://google.github.io/styleguide/pyguide.html を読んだ時のメモ
Imports
パッケージかモジュール単位でのみimportをする
Packages
モジュールはフルパスを指定してインポートする
# Reference in code with complete name. import sound.effects.echo # Reference in code with just module name (preferred). from sound.effects import echo
Nested/Local/Inner Classes and Functions
Nested/local/inner なクラスや関数を利用する
List Comprehensions
リスト内包表記は複雑にならない時は利用する
Default Iterators and Operators
リストや辞書、ファイルなどdefault iteratorsやoperatorsをサポートしている型では、それらを利用する
Yes: for key in adict: ... if key not in adict: ... if obj in alist: ... for line in afile: ... for k, v in dict.iteritems(): ... No: for key in adict.keys(): ... if not adict.has_key(key): ... for line in afile.readlines(): ...
Generators
ジェネレータは必要に応じて利用する
Lambda Functions
1行で収まるならOK
Conditional Expressions
1 if cond else 2 みたいなやつ
1行で収まるならOK
Default Argument Values
基本的にOK
ただし、mutableなオブジェクトはデフォルト値として渡すべきではない
また、b=time.time() みたいなのもモジュールがロードされた時にしか評価されないので注意
Properties
TODO
True/False evaluations
0, None,, {}, '' をbooleanとして評価するとFalseになる
基本的に if foo != : より if foo: という書き方をする
その他の注意
- None みたいなシングルトンと比較するときに == や != は使わずis や is not を使う
- デフォルト値がNoneの変数/引数xがNoneかどうかのチェックでif x is not None: という意味で if x: と書くときは注意が必要 値が指定されたけどそれが空文字や空リストだと if x: だとfalseと判定されてしまう
- x == False みたいな比較はしない するなら not x. NoneとFalseを区別したいなら if not x and x is not None
- integerの場合は0が暗黙的にFalseとなることを利用するより明示的に == 0としたほうが良い
Lexical Scoping
利用してOK
Function and Method Decorators
明確な利点がある時のみ利用する
Threading
組み込み型のatomicityに頼らない
Power Features
メタクラス、バイトコードへのアクセス、on-the-flyコンパイル、動的継承、object reparenting(?)、インポートハック、リフレクション、modification of system internals(?) とかは使わない
Semicolons
行の末尾にセミコロンは使わない
複数のコマンドを1行に収める目的でも使わない
Line length
80文字までにする
ただし、importが長くなった時やコメント中のURLについてはOKとする
Parentheses
不要ならカッコは書かない
Shebang Line
直接実行されるファイル以外には記載しない
Comments
TODO
Classes
親クラスがないときは objectを明示的に継承する
Imports formatting
1つのimportでインポートするのは1つ
Yes: import os import sys No: import os, sys
Access Control
https://packaging.python.org/tutorials/distributing-packages/ を読んだ時のメモ
Configuring your Project
Initial Files
プロジェクトに必要なファイル
setup.py
最重要ファイル
プロジェクトのルートディレクトリに配置する
サンプル
2つの重要な機能を提供
1. プロジェクトの設定を記載する
setup()という関数が含まれていて、この関数に渡す引数でプロジェクト名とかの設定をする
2. パッケージングに関する様々なコマンドを起動するためのCLIを提供
setup.cfg
setup.py で利用するオプションを含むiniファイル
README.rst
必須ではないけど、README
MANIFEST.in
省略
LICENSE.txt
省略
必須ではないが、プロジェクト名と同じか非常に近い名前のパッケージをプロジェクトのルート直下に一つ作り、その下に自分のpythonモジュールやパッケージを配置するのが一般的
setup() args
description
description='A sample Python project', long_description=long_description,
プロジェクトの説明
url
省略
author
省略
license
省略
classifiers
省略
keywords
省略
packages
packages=find_packages(exclude=['contrib', 'docs', 'tests*']),
プロジェクトにインクルードするパッケージのリスト
手動で列挙してもいいけど、setuptools.find_packagesを使えば自動でできる
(その際、テスト等のインストールやリリースが不要なパッケージはexcludeで指定しておく)
install_requires
install_requires=['peppercorn'],
プロジェクトに必要なパッケージを記載しておく
package_data
省略
data_files
省略
scripts
これじゃなくて、console_scriptsを使うのが推奨らしい
Choosing a versioning scheme
Standards compliance for interoperability
Pythonのプロジェクトは PEP440で定義されている public version schemeに従うことが求められる
以下は省略
Working in "Development Mode"
必須ではないが、プロジェクトでの作業中に"editable"モード または "develop"モードでプロジェクトをローカルにインストールするのが一般的
これによって、プロジェクトをインストールした状態で編集が可能になる
プロジェクトのルートディレクトリで下記を実行する
pip install -e .
- e は --editableの省略した形
このコマンドを実行すると "install_requires"で指定した依存パッケージや、"console_scripts"で指定したスクリプトもインストールされます
依存しているパッケージも編集可能な状態でインストールしたいときは
-e . -e git+https://somerepo/bar.git#egg=bar
依存しているパッケージをインストールしたくない時は
pip install -e . --no-deps
Packaging your Project
省略
Uploading your Project to PyPI
省略