我正在编写一个存储自动化模块来提供卷。我没有传递在存储控制器上实际创建卷所需的六个或更多参数,而是使用__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)
上面的例子非常好,只有一个小的例外。如何向parameter类中的描述符添加docstring并不明显。似乎用元类应该是可能的,但是元类实例化时描述符并没有被定义。在
我很清楚,有些人可能不同意我使用__slots__
的副作用,但我喜欢它有助于消除打字错误。尝试设置一个不存在的参数,并引发boom,AttributeError
。没有任何样板代码。可以说,在创建卷时让它失败更像python,但结果是使用默认值而不是拼写错误的参数。这实际上是一次无声的失败。在
我意识到可以简单地扩展参数类docstring,但是pydoc
和其他文档构建脚本的结果是该类的一个大的自由格式docstring和每个描述符的emptydocstrings。在
肯定有办法为__slots__
创建的描述符定义docstring吗?也许除了吃角子老虎还有别的办法?可变的namedtuple
或类似的?
不,没有向为
__slots__
中定义的名称生成的描述符对象添加docstring的选项。在这方面,它们类似于常规的非描述符属性。在对于没有插槽的常规对象,最多可以添加注释并设置默认值:
即使您将所有这些属性声明为
__slots__
,这一点仍然适用。在您可以将每个插槽“包装”在另一个描述符中,以
^{pr2}$property
对象的形式:请注意,这几乎是类上描述符的两倍:
但现在您的属性至少有docstring:
相关问题 更多 >
编程相关推荐