2016-04-29 52 views
0

我试图动态地将数据库名称添加到我的连接信息中(这是一个字典,其中包含用于连接的键值映射,例如psycopg2)。为此,我正在使用一个属性。我如何想象它在我脑海中的工作是将它传递给对象创建者的信息,然后动态地将我的canvas_conn字典中的'database'属性设置为database_name传入的任何内容。然后,我设置了另一个@property方法database_name以防万一它被更改为更新canvas_conn。但是,我的单元测试失败,数据库为KeyError@property没有正确更新对象创建?

这里是我的代码:

class Shard(mu.PrettyStr): 
    def __init__(self, 
       database_name, 
       schema_name, 
       cluster_id, 
       shard_id, 
       historical_connect=False, 
       canvas_conn=config3.CANVAS_INFO, 
       analytics_conn=config3.REDSHIFT_POSTGRES_INFO_PROD): 
     """ 

     @type database_name: str 
     :param server_id: 
     @type schema_name: str 
     :param name: 
     @type cluster_id: str 
     :param cluster_id: 
     @type shard_id: str 
     :param shard_id: 
     @type historical_connect: bool 
     :param historical_connect: 
     @type canvas_conn: dict 
     :param canvas_conn: 
     @type analytics_conn: dict 
     :param analytics_conn: 
     """ 
     self._database_name = database_name 
     self.schema_name = schema_name 
     self.cluster_id = cluster_id 
     self.shard_id = shard_id 
     self.historical_connect = historical_connect 
     self._canvas_conn = canvas_conn 
     self.analytics_conn = analytics_conn 

    @property 
    def database_name(self): 
     return self._database_name 

    @database_name.setter 
    def database_name(self, name): 
     self._database_name = name 
     # force the new database name into the conn info 
     self._canvas_conn = self._canvas_conn 

    @property 
    def canvas_conn(self): 
     return self._canvas_conn 

    @canvas_conn.setter 
    def canvas_conn(self, database_info): 
     database_info['database'] = self._database_name 
     self._canvas_conn = database_info 

这里是我的单元测试:

def test_descriptor_correctly_sets_database_attribute(self): 
     test_data = ('server_id', 'db_name', 'cluster_id', 'shard_id', True) 
     test_shard = cu.Shard(*test_data) 
     self.assertEqual(
      test_shard.canvas_conn['database'], 
      test_shard.database_name 
     ) 

回答

1

您绕过全部属性setter:

self._canvas_conn = canvas_conn 

那台_canvas_conn属性直接,并且根本不使用@canvas_conn.setter

self.canvas_conn代替:

self.canvas_conn = canvas_conn 

,因为只有这样的setter参与和'database_name'键设置过。

出于相同的原因,在设定器database以下行也是无用:

self._canvas_conn = self._canvas_conn