2017-11-23 1 views
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 
+1

https://stackoverflow.com/questions/1263451/python-decorators-in-classes – anuragal

+0

@Anuragalの可能性の重複は、ご回答ありがとうございました。私はその質問を見つけることができませんでした、そして、私はあなたにそれを報告していただきありがとうございます。私は一般化できる解決策を見つけることを試みています。重複した質問を提案しようとしていませんでした。 – elksie5000

+1

'func_wrapper()'がパス引数を受け取るようにする必要があります。 'func_wrapper(self、path)'と 'func(self、path) ' – eugenhu

答えて

0

、:

def csv_decorator(func): 
    def func_wrapper(self): 
     reader = func(self) 
     for row in reader: 
      self.data[row[0]][row[1]] = row[2] 
    return func_wrapper 


class CSV: 
    def __init__(self): 
     self.data = AutoVivification() 

@csv_decorator 
def load_data(self, path): 
    with open(path, encoding="utf-8") as f: 
     self.path = path 
     reader = csv.reader(f) 
     return reader 

はしかし、私はエラーが表示されます私は動作するいくつかのコードを持っています。

def csv_decorator(func): 
    def func_wrapper(self, path): 
     reader = func(self, path) 
     for row in reader: 
      self.data[row[0]][row[1]] = row[2] 
    return func_wrapper 


class CSV: 
    def __init__(self): 
     self.data = AutoVivification() 

    @csv_decorator 
    def load_data(self, path): 
     f = open(path, encoding="utf-8") 
     self.path = path 
     reader = csv.reader(f) 
     return reader 
関連する問題