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
)