I'm writing a storage automation module that provisions volumes. Instead of passing the half dozen or more arguments needed to actually create a volume on the storage controller, I created a parameter class using __slots__
that is passed into the create method like this:
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)
上記の例は、1 つの小さな例外を除いてうまく機能します。パラメーター クラスの記述子に docstring を追加する方法は明らかではありません。メタクラスで可能であるように思われますが、メタクラスがインスタンス化されるときに記述子が定義されていません。
の副作用を使用することに同意しない人がいることを痛感して__slots__
いますが、タイプミスをなくすのに役立つことは気に入っています。存在しないパラメータを設定してみると、ブーン、AttributeError
と上がります。定型コードなしですべて。ボリュームの作成時に失敗させるのは間違いなくよりPythonicですが、その結果、スペルが間違っているパラメーターの代わりにデフォルトが使用されることになります。それは事実上、サイレントエラーになります。
パラメータ クラスの docstring を単純に拡張することは可能ですがpydoc
、他のドキュメント作成スクリプトの結果は、クラスの大きな自由形式の docstringと各記述子の空の docstring になります。
確かに、によって作成された記述子のdocstringを定義する方法が必要__slots__
です? おそらく、スロット以外に別の方法がありますか?可変namedtuple
または類似?