2018年12月21日金曜日

開発環境

Head First Python 第2版 ―頭とからだで覚えるPythonの基本 (Paul Barry (著)、嶋田 健志 (監修)、木下 哲也 (翻訳)、オライリージャパン)の10章(関数デコレーター - 関数を包む)、自分で考えてみよう(p. 401)を取り組んでみる。

コード(Emacs)

Python 3

#!/usr/bin/env python3
def check_logged_in(func):
    '''
    >>> check_logged_in(func)()
    'ログインしていません。'
    >>> session['logged_in'] = True
    >>> check_logged_in(lambda: '現在ログインしています。')()
    '現在ログインしています。'
    >>> session.pop('logged_in')
    True
    >>> check_logged_in(func)()
    'ログインしていません。'
    >>> check_logged_in(func)(1, 2, a=3, b=4)
    'ログインしていません。'
    >>> session['logged_in'] = True
    >>> check_logged_in(lambda: '現在ログインしています。')(1, 2, a=3, b=4)
    '現在ログインしています。'
    >>> session.pop('logged_in')
    True
    >>> check_logged_in(func)(1, 2, a=3, b=4)
    'ログインしていません。'
    '''
    def wrapper(*args, **kwargs) -> str:
        if 'logged_in' in session:
            return func()
        return 'ログインしていません。'
    return wrapper


if __name__ == '__main__':
    import doctest
    globs = locals()
    globs.update({'session': {},
                  'func': lambda: '現在ログインしています。'})
    doctest.testmod(globs=globs)

入出力結果(Terminal, cmd(コマンドプロンプト), Jupyter(IPython))

$ ./sample5.py -v
Trying:
    check_logged_in(func)()
Expecting:
    'ログインしていません。'
ok
Trying:
    session['logged_in'] = True
Expecting nothing
ok
Trying:
    check_logged_in(lambda: '現在ログインしています。')()
Expecting:
    '現在ログインしています。'
ok
Trying:
    session.pop('logged_in')
Expecting:
    True
ok
Trying:
    check_logged_in(func)()
Expecting:
    'ログインしていません。'
ok
Trying:
    check_logged_in(func)(1, 2, a=3, b=4)
Expecting:
    'ログインしていません。'
ok
Trying:
    session['logged_in'] = True
Expecting nothing
ok
Trying:
    check_logged_in(lambda: '現在ログインしています。')(1, 2, a=3, b=4)
Expecting:
    '現在ログインしています。'
ok
Trying:
    session.pop('logged_in')
Expecting:
    True
ok
Trying:
    check_logged_in(func)(1, 2, a=3, b=4)
Expecting:
    'ログインしていません。'
ok
2 items had no tests:
    __main__
    __main__.func
1 items passed all tests:
  10 tests in __main__.check_logged_in
10 tests in 3 items.
10 passed and 0 failed.
Test passed.
$

0 コメント:

コメントを投稿