私は Python を学んでいる Common Lisp プログラマーです。部品から機能を構築できるようにしたいと思います。たとえば、属性を持つクラスがある場合、ドット表記を使用してクラス インスタンスの属性値にアクセスできますが、明らかに同じことを行う関数を作成することはできません。以下のコードでは、a.attr1 を要求できますが、bar(a,attr1) は機能しません。
class foo (object):
def __init__(self, x, y):
self.attr1 = x
self.attr2 = y
a = foo(17,23)
print a.attr1
def bar (obj, fun):
print obj.fun
bar(a, attr1)
NameError: 名前 'attr1' が定義されていません
私が「Pythonic」な方法で考えているわけではないことは間違いありませんが、もう少し複雑な例は、なぜこれをやりたいのかを示しています。属性でソートされた辞書の値を返したいとします。
d = {}
d['a'] = foo(17,23)
d['b'] = foo(13,19)
for v in sorted(d.values(), key = lambda x: x.attr1): print v.attr1
これは正常に機能しますが、次の関数は機能しません。
def baz (dict,attr):
for v in sorted(dict.values(), key = lambda x: x.attr): print v.attr1
baz(d,attr1)
NameError: 名前 'attr1' が定義されていません
Common Lisp では attr1 を引用して渡しますが、Python には同様の機能がないようです。助言がありますか?ありがとう!