126 def __set__(self, obj, value):
127
128 if self.deprecated and not obj._unpickling:
129 log.warning(
130 "Property %s is deprecated: %s",
131 self.fullPropertyName(obj),
132 self.__doc__,
133 )
134
135
136 proptype, allowcompat = None, False
137 if hasattr(self, "default"):
138 proptype = type(self.default)
139 if self.descr.__name__ == "OutputLevel":
140 allowcompat = True
141 elif obj in self.history:
142 proptype = type(self.history[obj][0])
143 allowcompat = True
144
145
146
147
148 if (
149 proptype
150 and not isinstance(None, proptype)
151 and not derives_from(value, "PropertyReference")
152 ):
153 try:
154
155 value = _isCompatible(proptype, value, self.descr.__name__)
156
157
158 if proptype == list:
159 try:
160 oldvec = self.descr.__get__(obj, type)
161 if oldvec:
162 tpo = type(oldvec[0])
163 for v in value:
164 _isCompatible(tpo, v, self.descr.__name__)
165 except AttributeError:
166
167 pass
168 except ValueError as e:
169 if allowcompat:
170 log.error(
171 f"inconsistent value types for {obj.getName()}.{self.descr.__name__} ({e})"
172 )
173 else:
174 raise
175
176
177
178 if not obj._isInSetDefaults() or obj not in self.history:
179
180 if hasattr(self, "default") and self.default is None:
181 obj.__iadd__(value, self.descr)
182 else:
183 self.descr.__set__(obj, value)
184 self.history.setdefault(obj, []).append(value)
185