我正在编写一个配置卷的存储自动化模块。我没有传递在存储控制器上实际创建卷所需的六个或更多参数,而是创建了一个参数类,使用__slots__
它传递给 create 方法,如下所示:
from mock import Mock
from six import with_metaclass
class VolumeParameterMeta(type):
def __new__(mcs, name, bases, dct):
# set __slots__ docstrings here?
return super(VolumeParameterMeta, mcs).__new__(mcs, name, bases, dct)
class VolumeParameter(with_metaclass(VolumeParameterMeta, object)):
__slots__ = ('name', 'size', 'junctionPath', 'svmName', 'securityStyle'
'spaceReserve')
def __init__(self, name):
self.name = name
class Volume(object):
def __init__(self, driver, name):
self.driver = driver
self.name = name
@classmethod
def create(cls, driver, param):
# do sanity check on param (volume not too large, etc)
driver.provision(param)
return cls(driver, param.name)
if __name__ == '__main__':
param = VolumeParameter('volume1')
param.svmName = 'vserver1'
param.junctionPath = '/some/path'
param.size = 2 ** 30
param.spaceReserve = param.size * 0.1
param.securityStyle = 'mixed'
volume = Volume.create(driver=Mock(), param=param)
上面的示例效果很好,但有一个小例外。如何将文档字符串添加到参数类中的描述符中并不明显。似乎元类应该是可能的,但是在实例化元类时没有定义描述符。
我敏锐地意识到有些人可能不同意我使用 的副作用__slots__
,但我喜欢它有助于消除拼写错误。尝试设置一个不存在的参数并引发繁荣AttributeError
。所有这些都没有任何样板代码。可以说让它在创建卷时失败更符合 Pythonic,但结果将是使用默认值而不是拼写错误的参数。这实际上是一个无声的失败。
我意识到可以简单地扩展参数类文档字符串,但是pydoc
其他文档构建脚本的结果是类的大型自由格式文档字符串和每个描述符的空文档字符串。
当然必须有一种方法来为由__slots__
?创建的描述符定义文档字符串。也许除了插槽之外还有另一种方法?一个可变的namedtuple
或类似的?