Google Python Style Guide を読んだ時のメモ

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を明示的に継承する

Strings

  1. じゃなくて formatか%で文字列を組み立てる

ファイル中では"をつかうのか'を使うのかを統一する
ただし、エスケープを回避するのに一部異なるのはOK

Imports formatting

1つのimportでインポートするのは1つ

Yes: import os
     import sys

No:  import os, sys

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

name
name='sample',

プロジェクトの名前
PyPIのリストに記載されるときにも利用される

version
version='1.2.0',

プロジェクトのバージョン

Choosing a versioning scheme も参照

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'],

プロジェクトに必要なパッケージを記載しておく

install_requires vs Requirements files も参照

python_requires
python_requires='>=3',

pythonのバージョンを指定する

package_data

省略

data_files

省略

scripts

これじゃなくて、console_scriptsを使うのが推奨らしい

entry_points
entry_points={
    'console_scripts': [
        'sample=sample:main',
    ],
},

console_scripts
"console_scripts"というエントリポイントを利用して、スクリプトのインタフェースを登録できる
上記の例だと、sampleというコマンドが実行できるようになって、実行するとsample:mainが呼び出される

Automatic Script Creationも参照

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

省略