Use __slots__ in Parameter classes

A typical stack may easily have dozens of parameters, so Parameter objects
are very common in memory. They're also very simple and change rarely, all
of which makes them a good candidate for being made lighter-weight using
slots to avoid creating __dict__.

Change-Id: I23e07876054cbaf220df1c9fc2d663b00130501b
Related-Bug: #1626675
This commit is contained in:
Zane Bitter 2016-10-06 09:40:45 -04:00
parent 55f0daa4cc
commit 21990655b6
1 changed files with 14 additions and 0 deletions

View File

@ -205,6 +205,8 @@ class Parameter(object):
return super(Parameter, cls).__new__(ParamClass)
__slots__ = ('name', 'schema', 'user_value', 'user_default')
def __init__(self, name, schema, value=None):
"""Initialise the parameter.
@ -299,6 +301,8 @@ class Parameter(object):
class NumberParam(Parameter):
"""A template parameter of type "Number"."""
__slots__ = tuple()
def __int__(self):
"""Return an integer representation of the parameter."""
return int(super(NumberParam, self).value())
@ -321,6 +325,8 @@ class NumberParam(Parameter):
class BooleanParam(Parameter):
"""A template parameter of type "Boolean"."""
__slots__ = tuple()
def _validate(self, val, context, template=None):
try:
strutils.bool_from_string(val, strict=True)
@ -339,6 +345,8 @@ class BooleanParam(Parameter):
class StringParam(Parameter):
"""A template parameter of type "String"."""
__slots__ = tuple()
def _validate(self, val, context, template=None):
self.schema.validate_value(val, context=context, template=template)
@ -349,6 +357,8 @@ class StringParam(Parameter):
class ParsedParameter(Parameter):
"""A template parameter with cached parsed value."""
__slots__ = ('parsed',)
def __init__(self, name, schema, value=None):
super(ParsedParameter, self).__init__(name, schema, value)
self._update_parsed()
@ -368,6 +378,8 @@ class ParsedParameter(Parameter):
class CommaDelimitedListParam(ParsedParameter, collections.Sequence):
"""A template parameter of type "CommaDelimitedList"."""
__slots__ = ('parsed',)
def __init__(self, name, schema, value=None):
self.parsed = []
super(CommaDelimitedListParam, self).__init__(name, schema, value)
@ -413,6 +425,8 @@ class CommaDelimitedListParam(ParsedParameter, collections.Sequence):
class JsonParam(ParsedParameter):
"""A template parameter who's value is map or list."""
__slots__ = ('parsed',)
def __init__(self, name, schema, value=None):
self.parsed = {}
super(JsonParam, self).__init__(name, schema, value)