Skip to content

Commit c3dc25a

Browse files
brubbeloroulet
authored andcommitted
Variant constructor validation check also works for prop setters
1 parent 71c6c4b commit c3dc25a

File tree

1 file changed

+37
-16
lines changed

1 file changed

+37
-16
lines changed

opcua/ua/uatypes.py

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -696,41 +696,62 @@ class Variant(FrozenClass):
696696
"""
697697

698698
def __init__(self, value=None, varianttype=None, dimensions=None, is_array=None):
699+
self._freeze = False # defers validation until ready.
700+
# Value, VariantType
699701
self._value = None
702+
self._variantType = None
700703
if isinstance(value, Variant):
701704
self.Value = value.Value
702705
self.VariantType = value.VariantType
703706
else:
704707
self.Value = value
705708
self.VariantType = varianttype
709+
# Dimensions
706710
self.Dimensions = dimensions
711+
if dimensions is None and isinstance(self.Value, (list, tuple)):
712+
dims = get_shape(self.Value)
713+
if len(dims) > 1:
714+
self.Dimensions = dims
715+
# is_array
707716
if is_array is not None:
708717
self.is_array = bool(is_array)
709718
else:
710719
self.is_array = isinstance(self.Value, (list, tuple))
720+
# Validation check
711721
self._freeze = True
712-
if self.VariantType is None:
713-
self.VariantType = self._guess_type(self.Value)
714-
if self.Value is None and not self.is_array and self.VariantType not in (VariantType.Null, VariantType.String,
715-
VariantType.DateTime):
716-
raise UaError("Non array Variant of type {0} cannot have value None".format(self.VariantType))
717-
if self.Dimensions is None and isinstance(self.Value, (list, tuple)):
718-
dims = get_shape(self.Value)
719-
if len(dims) > 1:
720-
self.Dimensions = dims
722+
self._validate()
721723

722724
@property
723725
def Value(self):
724726
return self._value
725727

726728
@Value.setter
727-
def Value(self, newValue):
728-
assert(not isinstance(newValue, Variant))
729-
if not (self._value is None or isinstance(newValue, type(self._value))):
730-
logger.warning("Datatype changed from {} to {} in Variant {}.".format(type(self._value), type(newValue), self))
731-
if isinstance(self._value, int) and self.VariantType in (VariantType.Float, VariantType.Double):
732-
newValue = float(newValue)
733-
self._value = newValue
729+
def Value(self, value):
730+
if not (self._value is None or isinstance(value, type(self._value))):
731+
logger.warning("Datatype changed from {} to {} in Variant {}.".format(type(self._value), type(value), self))
732+
self._value = value
733+
self._validate()
734+
735+
@property
736+
def VariantType(self):
737+
return self._variantType
738+
739+
@VariantType.setter
740+
def VariantType(self, variantType):
741+
if variantType is not None:
742+
self._variantType = variantType
743+
else:
744+
self._variantType = self._guess_type(self.Value)
745+
self._validate()
746+
747+
def _validate(self):
748+
if self._freeze is False:
749+
return
750+
elif isinstance(self._value, int) and self.VariantType in (VariantType.Float, VariantType.Double):
751+
self._value = float(self._value)
752+
elif self._value is None and not self.is_array and \
753+
self.VariantType not in (VariantType.Null, VariantType.String, VariantType.DateTime):
754+
raise UaError("Non array Variant of type {0} cannot have value None".format(self.VariantType))
734755

735756
def __eq__(self, other):
736757
if isinstance(other, Variant) and self.VariantType == other.VariantType and self.Value == other.Value:

0 commit comments

Comments
 (0)