2

就我而言,我有这个课程:

 class CSVUploader():                                                                                                                                          
     def __init__(self, **kwargs):                                               
         self.acc = kwargs['acc']                                                
         self.prod = kwargs['prod']                                              
         self.url_id = kwargs['url_id']                                          
         self.dest = kwargs['dest']                                              
         self.header = kwargs['header']                                          
         self.metadata = kwargs.copy()                                           
         self.table_name = '_'.join([self.prod, self.url_id])

这个类包含很多信息,并根据里面的内容做了很多事情**kwargs。稍后,我将需要向要传递给此类的字典 (**kwargs) 添加更多参数。问题是我真的不知道是否需要再添加 2 个或 10 个参数。

现在我self.<variable>在这个类中执行逻辑时使用。例如:

self.check_columns(self.table_name, self.header)

我的另一个想法是使用self.metadata['variable']而不是self..... 最后我的最后一个想法是创建一个单独的类来容纳所有self.header这些。但在我的代码中,我会这样称呼它:

metadata = Metadata()
metadata.header

所以有很多方法可以做到这一点,最pythonic的方法是什么。另外,我对保持我的代码逻辑分离、干净且易于阅读很感兴趣。

4

1 回答 1

0

您可以将 kwargs 中的所有变量添加到实例中:

class CSVUploader():       
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

或者,您可以使用命名元组并将 CSVUploader 的方法更改为作用于它的函数。

CSVUploader = collections.namedtuple('CSVUploader', list_of_variable_names)
于 2013-11-14T22:34:41.787 回答