0

こんにちは私はタイピングを節約し、これを行うことで「賢く」しようとしていました...

class foo(object):
    def __init__()
        self.eric = 0
        self.john = 0
        self.michael = 0
        self.switchdict = {'Eric':self.eric, 'John':self.john, 'Michael':self.michael}

    def update(self, whattoupdate, value):
       if whattoupdate in self.switchdict:
           self.switchdict[whattoupdate] += value

それが機能しなかった後、整数値が参照によって渡されるのではなく、整数として渡されることは明らかでした。属性をリストに変換することで長い回避策に頼りましたが、もっと良い方法があると思います。

私は実際にこれらの属性を約30個持っているので、入力を保存してリストに追加できるのは非常に便利ですが、私のgoogle-fuはこれを行うための満足のいく方法を提供しませんでした。

賢いが、それでも読みやすく、Pythonicな提案はありますか?

4

1 に答える 1

1

おめでとう!の限定された形式を再発明しましたsetattr()。:-)

この道をはるかに下って行くと、メンテナンスの悪夢に陥っていると思いますが、主張する場合は、次のようなことを検討します。

class foo(object):
    allowedattrs = ['eric', 'john', 'michael']

    def __init__(self):
        self.eric = 0
        self.john = 0
        self.michael = 0
        self.switchdict = {'Eric':self.eric, 'John':self.john, 'Michael':self.michael}

    def update(self, whattoupdate, value):
        key = whattoupdate.lower()
        if key not in self.allowedattrs:
            raise AttributeError(whattoupdate)
        setattr(self, key, getattr(self, key) + value)

f = foo()
f.update('john', 5)
f.update('john', 4)
print f.john

しかし、値を素敵な場所に保存する方が本当に簡単ではないでしょうdefaultdictか。

from collections import defaultdict

class foo(object):
    allowedattrs = ['eric', 'john', 'michael']

    def __init__(self):
        self.values = defaultdict(int)

    def update(self, whattoupdate, value):
        self.values[whattoupdate] += value

f = foo()
f.update('john', 5)
f.update('john', 4)
print f.values['john']
于 2012-10-16T23:39:32.163 に答える