@@ -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