2022-03-08

【備忘録】Python のデコレータ

独学でプログラミング言語を使っていると、ときどきとんでもなく初歩的なことを知らなくて赤面😳することがあります。Python のデコレータもそのひとつです。備忘録として、簡単な GUI サンプルに適用してみました。

下記の OS 環境で動作確認をしました。

Fedora Silverblue 35 x86_64
Python 3.10.2
PySide6 6.2.3
qt_filedialog.py
#!/usr/bin/env python
# coding: utf-8
# reference
# https://github.com/andriyantohalim/PySide2_Tutorial
import sys
import time
from PySide6.QtGui import QAction
from PySide6.QtWidgets import (
QApplication,
QFileDialog,
QMainWindow,
QPlainTextEdit,
)
def timeit(f: callable):
"""
Reference:
https://stackoverflow.com/questions/5478351/python-time-measure-function
"""
def wrap(*args, **kwargs):
time_start = time.time()
ret = f(*args, **kwargs)
time_end = time.time()
msec_elapsed = (time_end - time_start) * 1000.0
print('{:s} function took {:.3f} ms'.format(f.__name__, msec_elapsed))
return ret
return wrap
class Example(QMainWindow):
editor = None
def __init__(self):
super().__init__()
self.init_ui()
self.setGeometry(300, 300, 350, 300)
self.setWindowTitle('File dialog')
def init_ui(self):
self.editor = QPlainTextEdit()
self.setCentralWidget(self.editor)
self.statusBar()
open_file = QAction('Open', self)
open_file.setShortcut('Ctrl+O')
open_file.setStatusTip('Open new file.')
open_file.triggered.connect(self.show_dialog)
menubar = self.menuBar()
file_menu = menubar.addMenu('&File')
file_menu.addAction(open_file)
def show_dialog(self):
dialog = QFileDialog()
if dialog.exec():
filename = dialog.selectedFiles()[0]
data = self.read_data(filename)
self.editor.setPlainText(data)
@timeit
def read_data(self, filename):
f = open(filename, 'r', encoding='UTF-8')
data = f.read()
return data
def main():
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()

聖書のファイル bible.txt を読み込んでみました。

qt_filedialog.py の実行例

GUI の実行例は実は重要ではなく、今回は、下記の出力の方が重要です。

read_data function took 14.084 ms

参考サイト

  1. Python time measure function - Stack Overflow [2011-03-29]

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ Linuxへ
にほんブログ村

0 件のコメント: