dict オブジェクトから子クラスを作成しています
class FeatureVector(dict):
def __init__(self, init_val=0):
super().__init__()
self.init_val = init_val
このクラス内で、次の単純化された例のように、辞書内包表記を使用して関数を自己割り当てようとしました。
def load_fv(self, fvlist):
self = {k:float(val) for k, val in fvlist}
この例では、fvlist は次のように構築されます。
fvlist = [["example", 1], ["feature", 2], ["vector", 3], ["list", 4]]
この load_fv メソッドは機能しません。口述は空のままです:{}
ここで説明されているように、いくつかの検索の後、これself
は不変であるためであることがわかりました: Why is `self` in Python objects immutable?
だから多分、私はしてはいけないことをしようとしているだけなのです。もちろん、for ループを使用して辞書内包表記を行う関数を作成する可能性もあります。
def load_fv(self, fvlist):
self.clear()
for x, y in fvlist:
self[x] = y
それでも、ディクショナリがすでに使用可能な場合、またはディクショナリのようなオブジェクトをディクショナリで初期化したい場合に、ディクショナリを dict-child クラスに「自己割り当て」する方が効率的な場合を想像できます。
その場合、次のようなことができます:
def __init__(self, init_dict, init_val=0):
super().__init__()
self.init_val = init_val
self.load_fv(fvlist)
def load_fv(self, fvlist):
self.clear()
if isinstance(fvlist, dict) or isinstance(fvlist, FeatureVector):
fvlist = [[key, val] for key, val in fvdict.items()]
for x, y in fvlist:
self[x] = y
それでも、これは本当にエレガントで良心的ではありません。より良い1行/あまり冗長でない方法はありますか?