Python入門(8.その他)です。
Python[完全]入門を参考に執筆しました。
アスペクト指向のように、Pythonでは単にbeforeのように「処理の前後に処理を行いたい」という場合、デコレータと呼ばれる機能を使うことができる。
def func_msg(func): def wrapper(*args, **kwargs): print(func.__name__ + "を実行開始") func(*args, **kwargs) print("関数の実行終了") return wrapper @func_msg def hoge(msg): print(msg) hoge("hoge")
デコレータには引数を与えることもできますし、複数のデコレータをつけることも、複数の引数を与えることもできます。関数トレース以外にも、任意のHTMLタグを任意の文字列の前と後につけるなど、用途は幅広いです。
Pythonでデータを格納するクラスを作るのであれば、dataclassデコレータを使うと便利。
dataclassデコレータを使うことで、メンバ変数に対してそれぞれの値を設定するようなコンストラクタを、自分で書かなくても自動で勝手に付けてくれる。
メンバ変数は、クラス変数として、class文の下に、型宣言(型アノテーション)とデフォルト値と一緒に記述する。記述の雰囲気としても、self.を用いるのではなく、C++やJavaと同様の見た目になっていい感じである。
たとえば、dataclassデコレータを使わない場合、以下のように記述する。
class Hoge: __init__(self, foo: int = 0, bar: int = 0): self.foo = foo self.bar = bar
これが、dataclassデコレータを使うと以下のようになる。
@dataclass class Hoge: foo: int = 0 bar: int = 0
__init__は自動的に作成される。
assert文についてはデバッグを参照のこと。
関数 | 説明 |
---|---|
eval() | 式を評価する関数。たとえばユーザーが入力したPythonの評価式を実行したりする時に使える。 |
exec() | 文字列をPythonコードとして実行する関数。 |
compile() | 文字列やファイルの内容をPythonプログラムとしてコンパイルする関数。 |
breakpoint() | プログラムの実行を一時停止して、pdb(Pythonデバッガ)に移行する関数。 |
詳しくは以下の書籍が参考になる。
Python 3には後方互換性がない。たとえば、「print x」のような文は使えず、「print(x)」と書く必要がある。このため、YumをPython 3で書き直したDNFなどがLinux業界でも作られている。