编辑:ChatterOne的答案很好。我必须保持简单。没有奇怪或古怪的行为值得避免重复简单,明确和有用的变量。
我想要的(伪代码示例):摆脱“服务器”参数。
Config.default_values.server = Server.application
class ApplicationDbConfig(Enum):
database_1 = Config(Database.db1)
database_2 = Config(Database.db2)
...
Config.default_values.server = Server.warehouse
class WarehouseDatabaseConfig(Enum):
database_1 = Config(Database.db1)
database_2 = Config(Database.db2)
...
最好的解决方案是:
保持变量明确。无需隐藏它或在内部更改状态。明确明确是更好的选择。因此,我将放弃摆脱的目标,s
并将其保持简单。
s = Server.application
class ApplicationDatabaseConfig(Enum):
database_1 = Config(Database.db1, s)
database_2 = Config(Database.db2, s)
...
s = Server.warehouse
class WarehouseDatabaseConfig(Enum):
database_1 = Config(Database.db1, s)
database_2 = Config(Database.db2, s)
...
最初的问题是:使用继承覆盖默认参数是否值得?还是您有更好的方法呢?
这是我用于继承的原始代码。这占用了太多空间,并给观看者增加了很多噪音。
@dataclass
class Config:
database: Database
server: Server
driver: Driver = Driver.sql_serv_native_client_11
is_trusted: bool = True
additional_params: str = None
@dataclass
class ApplicationConfig(Config): server: Server = Server.application
@dataclass
class WarehouseConfig(Config): server: Server = Server.warehouse
...
class ApplicationDatabasesConfig(Enum):
database_1 = ApplicationConfig(Database.db1)
database_2 = ApplicationConfig(Database.db2)
...
class WarehouseDatabasesConfig(Enum):
database_3 = WarehouseConfig(Database.db3)
database_4 = WarehouseConfig(Database.db4)
...
假设您要使用不同的参数实例化同一类,除了少数可能具有或没有默认值的参数外,我会做类似的事情(未经测试,只是快速键入),还假设您有一个默认驱动程序:
class Config:
def __init__(self, database, server=Server.serverX, driver=Driver.default, is_trusted=True, additional_params=None):
self.database = database
self.driver = driver
self.server = server
self.is_trusted = is_trusted
self.additional_params = additional_params
然后您可以像这样使用它:
database_1 = Config(Database.db1)
database_2 = Config(Database.db2)
database_3 = Config(Database.db3)
database_4 = Config(Database.db4, Server.serverY)
但这对我来说直截了当,所以也许我错过了一些东西。
顺便说一句,您也可以将其与命名参数一起使用,例如
database_4 = Config(database=Database.db4, server=Server.serverY)
如果您想要更详细/明确(再次,未经测试,可能有错别字)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句