Diary over Finite Fields

515ひかるが書き溜めたメモとコラムと雑記

最近の気づき

最近の気づきですが、 setattrgetattr が便利ですね。

2. 組み込み関数 — Python 3.6.1 ドキュメント

どういうものかというと、みなさんもクラスを定義したときにクラスの属性の値を動的に取得したりしたいですよね。

ということでこんな風にやります。

class Foo():
    foo = 1

f = Foo()
getattr(f, 'foo') # => 1

属性名を文字列にすることで取得ができます*1

たとえば、こんなふうに使えますね。 Django でモデルを定義したときに、

# models.py
from django.db impoort models
class Foo(models.Model):
    foo = models.IntegerFileld(default=0)
    bar = models.IntegerFileld(default=1)

# Foo の `foo` および `bar` をセットしたいとき
f = Foo()
values = [100, 1000] # foo および bar の値
for col, val in zip([col.name for col in f._meta.local_field][1:], values):
    setattr(f, col, val)

f.foo = 100
f.bar = 1000

などと書けます。 今の場合2つしか属性がないですが、 10個くらいあってもこの for 文は使えるので便利です。

何がいいたいかというと、なんで最近になるまで setattrgetattr 知らなかったんだろう、ということです。。まだまだ未熟です。。。

*1:むしろ文字列でないといけない。