Ich schreibe ein Speicherautomatisierungsmodul, das Volumes bereitstellt. Statt das halbe Dutzend vorbei oder mehr Argumente benötigt, um tatsächlich ein Volumen auf den Speicher-Controller zu erstellen, habe ich eine Parameterklasse __slots__
verwenden, die in die create-Methode wie folgt übergeben wird:DocString zu __slots__ descriptor hinzufügen?
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)
Das obige Beispiel funktioniert gut mit Eine kleine Ausnahme. Es ist nicht offensichtlich, wie man den Deskriptoren in der Parameterklasse Docstrings hinzufügt. Es scheint wie es mit einer Metaklasse möglich sein sollte, aber die Deskriptoren sind nicht definiert, wenn die Metaklasse instanziiert wird.
Ich bin mir sehr wohl bewusst, dass einige mit meiner Seite einen Nebeneffekt von __slots__
nicht zustimmen können, aber ich mag, dass es hilft, Tippfehler zu beseitigen. Versuchen Sie, einen Parameter einzustellen, der nicht existiert, und der Boom, AttributeError
, wird erhöht. Alles ohne Vorwahlcode. Es ist wohl mehr Pythonic, wenn es bei der Volumenerstellung fehlschlägt, aber das Ergebnis wäre, dass ein Standard anstelle eines falsch geschriebenen Parameters verwendet wird. Es wäre effektiv ein stiller Fehler.
Ich weiß, es ist möglich, einfach die docstring Parameterklasse zu erweitern, aber das Ergebnis von pydoc
und andere Dokumentation Gebäude Skripte ist eine große Freiform-docstring für die Klasse und leer Docstrings für jede der Deskriptoren.
Sicherlich muss es eine Möglichkeit geben, Docstrings für die von __slots__
erstellten Deskriptoren zu definieren? Vielleicht gibt es einen anderen Weg als Slots? Ein veränderbares namedtuple
oder ähnliches?
Danke für die Lösung und Erklärung! –