LoginSignup
1
0

More than 1 year has passed since last update.

djangoの開発中に気になったこと覚書

Last updated at Posted at 2021-08-04

これまで業務では使ったことがなかったPythonですが、この度Djangoで実装されたサイトを修正する案件があったためその時に調べて「へぇ〜」となったTipsを残しておきます。

Djangoの書き方というよりは、Pythonの知識になります。  

with

https://docs.python.org/ja/3/reference/compound_stmts.html#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は多重継承可能

できれば上記の疑問については随時調べてアップデートしていきたい

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0