これまで業務では使ったことがなかったPythonですが、この度Djangoで実装されたサイトを修正する案件があったためその時に調べて「へぇ〜」となったTipsを残しておきます。
Djangoの書き方というよりは、Pythonの知識になります。
with
try/finally の標準的な使い方を抽出する目的で追加したとのことです。
with文を使うと、↓これが
manager = (EXPRESSION)
enter = type(manager).__enter__
exit = type(manager).__exit__
value = enter(manager)
hit_except = False
try:
TARGET = value
SUITE
except:
hit_except = True
if not exit(manager, *sys.exc_info()):
raise
finally:
if not hit_except:
exit(manager, None, None, None)
↓こうなる
with EXPRESSION as TARGET:
SUITE
具体的な利用例はこんな感じ
>>> with open('hidamari.txt', 'r') as f:
... divide_by_zero(len(f.read()))
...
ZeroDivisionError: division by zero
>>> print(f.closed)
True
contextlib.contextmanager
with文を使うには、渡すオブジェクト(コンテキストマネージャー)に __enter___
(前処理)と __exit__
(後処理)が定義されていないといけない。
コンテキストマネージャを定義するためデコレーターがこれ。
https://docs.python.org/ja/3/library/contextlib.html#contextlib.contextmanager
↓こんな感じに定義しておくと
import contextlib
@contextlib.contextmanager
def reading(filename):
file = open(filename, 'r')
try:
yield file
finally:
file.close()
↓こういう風に使える
with reading('hidamari.txt') as f:
print(f.read())
自作フィルター
Djangoにはフィルターと呼ばれるtemplateの変数をtemplate内で成形してくれる便利な関数があります。
例↓
<p>{{ value | upper }}<p>
-- この例ではvalueの文字をすべて大文字にして出力する。
フィルターを自作することが可能。
アプリケーション配下にtemplatetags
というフォルダを作成し、その下に @register.filter
アノテーションでフィルターと宣言して、値を変換する関数を記述する。
参考:https://e-tec-memo.herokuapp.com/article/22/
その他、同僚から聞いて「確かに」と思った事柄、疑問
-
self とは
なぜクラスメソッドに書くのか -
メソッドと関数の違い
-
__ がメソッド名の頭につく意味
クラス内でしか呼び出しをしないプライベートなメソッドを慣例的にそう書いているようにみえる -
pythonの三項演算子の書き方がちょっと不思議
-
リストの内包表記がわかりにくい
-
インデントの重要性
-
スコープがわかりにくい
-
pythonは多重継承可能
できれば上記の疑問については随時調べてアップデートしていきたい