2016-04-29 9 views
0

接続情報(たとえば、psycopg2への接続のキーマップ値を持つ辞書)にデータベース名を動的に追加しようとしています。このため私はプロパティを使用しています。私が頭の中で働いていると思うのは、オブジェクト作成者に渡された情報を受け取り、次にcanvas_conn辞書の'database'属性を動的に設定してdatabase_nameを渡すことです。次に、@propertyメソッドを追加しました。 canvas_connを更新するように変更された場合は、database_nameが表示されます。しかし、私の単体テストは、「データベース」のために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

あなたは完全にプロパティのセッターバイパスされています

self._canvas_conn = canvas_conn 

_canvas_conn属性を設定します直接、@canvas_conn.setterはまったく使用されません。

セットの代わりにself.canvas_conn

self.canvas_conn = canvas_conn 

だけにしてセッターが関与していると'database_name'キーがあまりにも設定されているため。

同じ理由で、databaseセッターに次の行も無用です:

self._canvas_conn = self._canvas_conn 
関連する問題