1

私は 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 には同様の機能がないようです。助言がありますか?ありがとう!

4

1 に答える 1

2
def bar(obj, fun):
    print(getattr(obj, fun))

bar(a, 'attr1')

attr1問題は、非常に正当な理由で python が認識しないことです。そのようなシンボルはありません。

同様に:

def baz(d, attr):
    for v in sorted(d.values(), key = lambda x: getattr(x, attr)):
        print(v.attr1)

>>> d = { 'a':foo(17,23), 'b':foo(13,19) }
>>> baz(d, 'attr1')
13
17

ほとんどの場合、そのようなことを行う場合、実際に必要なのは簡単な辞書です。

于 2013-05-27T20:33:36.587 に答える