0
csvモジュールに基づくメソッドを持つクラスを変更しようとしています。Pythonのクラスメソッドにデコレータを適用する方法
データは、単純な3列のcsvファイルで、辞書のネストされたリストに変えたいと思っています。
私はこのSO questionの助けを借りてそれを管理しました。
しかし、もっと一般的な 'load_data'メソッドを実装したいと思います。デコレータを使用して、ロードされたcsvの2つのカラムを取り出して辞書のリストとして出力するメソッドを導入する方法があります。
ラッパー関数と提案されたcsv_to_dict_dictsメソッドを作成しようとしましたが、コメントアウトされています。
import csv
class AutoVivification(dict):
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
"""
def csv_decorator(func):
def func_wrapper(self):
for row in reader:
return dict(self.data[row[0]][row[1]] = row[2])
return func_wrapper
"""
class CSV:
def __init__(self):
self.data = AutoVivification()
def load_data(self, path):
with open(path, encoding="utf-8") as f:
self.path = path
reader = csv.reader(f)
for row in reader:
self.data[row[0]][row[1]] = row[2]
#@csv_decorator
#def csv_to_dict_dicts(self):
# return self.load_data(path)
c = CSV()
c.load_data(path)
UPDATE:
私はこのようにSO questionを使用して試してみた:上記の貢献者の指導で
TypeError: func_wrapper() takes 1 positional argument but 2 were given
https://stackoverflow.com/questions/1263451/python-decorators-in-classes – anuragal
@Anuragalの可能性の重複は、ご回答ありがとうございました。私はその質問を見つけることができませんでした、そして、私はあなたにそれを報告していただきありがとうございます。私は一般化できる解決策を見つけることを試みています。重複した質問を提案しようとしていませんでした。 – elksie5000
'func_wrapper()'がパス引数を受け取るようにする必要があります。 'func_wrapper(self、path)'と 'func(self、path) ' – eugenhu