※私個人の主張もあります。
追記予定
スキルは、国内問わず、優秀なフレームワーク、ライブラリから得られるものが多いと思います。
Djangoより
https://github.com/django/django
↑high-level Python Web framework
アプリケーションはどのように実行されるのか
①フォルダ構成は下記の通りで__main__.pyを作成しておく。
/プロジェクト名/アプリ名/__main__.py
②カレントディレクトリを/プロジェクト名にしておき、下記コマンドを実行
python -m アプリ名
③__main__.pyが実行される。
※カレントディレクトリがアプリのルートになるので、import時の問題にも遭遇しにくいメリットがありますね。
同じモジュールからimportする場合はカッコを活用する。
from .resolvers import (
LocalePrefixPattern, RegexPattern, RoutePattern, URLPattern, URLResolver,
)
エレガントですね。ワイルドカードは避ける方向で行きましょう。
クラスの役割(責務)はコメントとして記述する
class ContextList(list):
"""
A wrapper that provides direct key access to context items contained>
in a list of context objects.
"""
責務をコメントに書くことで、読み手に対して、どのようなクラスかを明確に示す事ができます。
責務が沢山あると、クラスを分割した方がよいとかの気づきになりますから(単一責任の原則)
プロパティは@propertyを活用する。
self.__name ⇒サブクラスを含めた外部から呼び出しをしない
self._name ⇒外部から呼び出しをしない
self.name ⇒外部へ公開される属性(public)。
プロパティ ⇒外部へ公開される。ゲッタ、セッター時に何らかの処理をしたいのであれば
プロパティとして実装するのが良い
オブジェクトのデータはプロパティ(特性)またはデータ属性、振る舞いはメソッドで実装しましょう。
⇒プロパティはデータ属性をクラスのパブリックインターフェイスとして安全に公開するためにある。
⇒プロパティ内でバリデートの実装も多い。
⇒setterを実装しないプロパティも多数ある。
下記の記事はダンダーの説明が分かりやすかったので、参考に
https://qiita.com/shiracamus/items/5331cd89b202953403dd
pythonはオブジェクト指向の言語であるが、関数をまとめたモジュールの実装もあり
django/django/template/loader.pyを参考に
グローバルな定数/変数宣言をするモジュールクラスもある。
DEBUG = False
DEBUG_PROPAGATE_EXCEPTIONS = False
ADMINS = []
すべて大文字
elseではなく早期リターンの活用
if callable(c) and not inspect.isbuiltin(c) and method_has_no_args(c):
return c()
return len(self.object_list)
早期リターンはコードを簡潔にすることが多いですね
pythorchより
https://github.com/pytorch/pytorch
⇒Deep neural networks built on a tape-based autograd system
型ヒントを実装する
def bundle_inputs(
model: torch.jit.ScriptModule,
inputs: Union[Optional[Sequence[Tuple[Any, ...]]], Dict[Callable, Optional[Sequence[Tuple[Any, ...]]]]],
info: Optional[Union[List[str], Dict[Callable, List[str]]]] = None,
*,
_receive_inflate_expr: Optional[List[str]] = None,
) -> torch.jit.ScriptModule:
引数の型、戻り値の型ヒントが明記されている。