Я использую win32com для управления Visio из Python.
Получение и установка значений таблиц просты:
print(shp.CellsU('PinX').ResultStr(''))
# and
shp.CellsU('PinX').FormulaU = '1'
Пока все хорошо, но мне нужен более короткий синтаксиспереопределив сеттер и геттер, чтобы получить что-то вроде:
print(shp.PinX)
# and
shp.PinX = '1'
Итак, я выбрал свойство:
ShapeClass = type(shp)
def SetPinX(self,value):
self.CellsU('PinX').FormulaU = value
def GetPinX(self):
return self.CellsU('PinX').ResultStr('')
ShapeClass.PinX = property(GetPinX,SetPinX)
Теперь странный результат - Геттер работает просто отлично (print (shp.PinX) дает ожидаемое значение), но установщик не будет работать.
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
~\AppData\Local\conda\conda\envs\YG_Package_1\lib\site-packages\win32com\client\__init__.py in __setattr__(self, attr, value)
478 try:
--> 479 args, defArgs=self._prop_map_put_[attr]
480 except KeyError:
KeyError: 'PinX'
During handling of the above exception, another exception occurred:
AttributeError Traceback (most recent call last)
<ipython-input-28-23f68b65624d> in <module>()
----> 1 shp.PinX= '1'
~\AppData\Local\conda\conda\envs\YG_Package_1\lib\site-packages\win32com\client\__init__.py in __setattr__(self, attr, value)
479 args, defArgs=self._prop_map_put_[attr]
480 except KeyError:
--> 481 raise AttributeError("'%s' object has no attribute '%s'" % (repr(self), attr))
482 self._oleobj_.Invoke(*(args + (value,) + defArgs))
483 def _get_good_single_object_(self, obj, obUserName=None, resultCLSID=None):
AttributeError: '<win32com.gen_py.Microsoft Visio 15.0 Type Library.IVShape instance at 0x85710888>' object has no attribute 'PinX'
dir (ShapeClass) показывает атрибут PinX просто отлично.
Тестированиес собственным классом тоже работал.Так что ошибка не в том, как я реализую свойство.
Я подозреваю, что win32com испытывает проблемы с переопределением сеттеров.
У кого-нибудь есть идеи, как решить проблему