【Python】ファイル名、行番号、関数名を取得して表示する【デバッグ】

254, 2019-11-25

C ではマクロを使ってファイル名とか便利に表示できる。

#include <stdio.h>

#define WARN(mes) { \
    fprintf(stderr, "WARN: %s: %d: %s: %s\n", __FILE__, __LINE__, __func__, mes); \
}

int main(void) {
    WARN("Hello, World!");
    // WARN: test.c: 8: main: Hello, World!
    return 0;
}

デバッグ時のログ取りとかで重宝。
Python3 でもできないか調べてみたら
http://stackoverflow.com/questions/6810999/how-to-determine-file-function-and-line-number
を見つけたので改造した。

import inspect
from datetime import datetime


def getframeinfo(stackIndex=2):
    """
    @see http://stackoverflow.com/questions/6810999/how-to-determine-file-function-and-line-number
    @return frameInfo
    """

    stack = inspect.stack()
    if stackIndex >= len(stack):
        return None

    callerframerecord = stack[stackIndex]
    frame = callerframerecord[0]
    info = inspect.getframeinfo(frame)

    return info


def header(prefix, info):
    now = datetime.now()
    if info:
        return f'{str(now)}: {prefix:>6}: {info.filename}: {str(info.lineno)}: {info.function}(...):'
    else:
        return f'{str(now)}: {prefix:>6}:'


def info(*args, **kwargs):
    head = header('INFO', getframeinfo())
    print(head, *args, **kwargs)


def warn(*args, **kwargs):
    head = header('WARN', getframeinfo())
    print(head, *args, **kwargs)


def error(*args, **kwargs):
    head = header('ERROR', getframeinfo())
    print(head, *args, **kwargs)


def main():
    info('user is logged-in')
    warn('file is not found')
    error('permission error')


if __name__ == '__main__':
    main()

↑のコードを実行すると↓のような結果になります。

2019-11-25 10:35:09.866388:   INFO: .\a.py: 46: main(...): user is logged-in
2019-11-25 10:35:09.867386:   WARN: .\a.py: 47: main(...): file is not found
2019-11-25 10:35:09.868384:  ERROR: .\a.py: 48: main(...): permission error

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク