Issue2636
Created on 2017-10-28.03:22:03 by lucabrasi, last changed 2018-11-04.15:02:46 by jeff.allen.
| Messages | |||
|---|---|---|---|
| msg11633 (view) | Author: (lucabrasi) | Date: 2017-10-28.03:21:59 | |
Hi, After upgrading to Jython 2.7.1 , we're facing issue with pyangbind Python library (This is a library that generates Python classes from a YANG model). Jython 2.7.1 throws AttributeError readonly exception when calling yangtypes.py from pyangbind library. After investigation, it seems error is similar as described here: https://stackoverflow.com/questions/12891021/jython-attributeerror-read-only-attr However, we don't see this issue with Jython 2.7.0 I've attached the yangtypes.py file from pyangbind library. Thanks |
|||
| msg11634 (view) | Author: (lucabrasi) | Date: 2017-10-28.05:47:55 | |
Below is the Jython traceback:
File "/data/naas/ServicePackages/servicemodel/controller/devices/device/vrfs/vrf/__init__.py", line 67, in __init__
self.__router_eigrp = YANGDynClass(base=router_eigrp.router_eigrp, is_container='container', yang_name="router-eigrp", module_name="l3features", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://anutanetworks.com/l3features', defining_module='l3features', yang_type='container', is_config=True)
File "/data/naas/ServicePackages/pyangbind/lib/yangtypes.py", line 1167, in YANGDynClass
return YANGBaseClass(*args, **kwargs)
File "/data/naas/ServicePackages/pyangbind/lib/yangtypes.py", line 997, in __init__
self._yang_name = yang_name
TypeError: readonly attribute
One workaround is to change the __slots__ from pyangbind to use a different name (Eg: self._yang_myname in this case). But this requires a lot of side changes in pyanglib:
class YANGBaseClass(base_type):
# we only create slots for things that are restricted
# in adding attributes to them - this means containing
# data nodes. This means that we can allow
# leaf._someattr to be used by consuming code - it
# also fixes an issue whereby we could set __slots__
# and try and inherit a variable-length inbuilt such
# as long, which is not allowed.
if yang_type in ["container", "list"] or is_container == "container":
__slots__ = tuple(clsslots)
_pybind_base_class = re.sub("<(type|class) '(?P<class>.*)'>", "\g<class>",
str(base_type))
def __new__(self, *args, **kwargs):
obj = base_type.__new__(self, *args, **kwargs)
return obj
def __init__(self, *args, **kwargs):
self._default = False
self._mchanged = False
self._yang_myname = yang_name
self._mymodule_name = module_name
self._parent = parent_instance
self._choice = choice_member
self._path_helper = path_helper
self._supplied_register_path = supplied_register_path
self._base_type = base_type
self._is_leaf = is_leaf
self._is_container = is_container
self._is_config = is_config
self._extensionsd = extensions
self._extmethods = extmethods
self._is_keyval = is_keyval
self._register_paths = register_paths
self._mynamespace = namespace
self._yang_type = yang_type
self._defining_module = defining_module
self._metadata = {}
self._empty_tag = False
clsslots = ['_default', '_mchanged', '_yang_myname', '_mymodule_name', '_choice', '_parent',
'_supplied_register_path', '_path_helper', '_base_type',
'_is_leaf', '_is_container', '_extensionsd',
'_pybind_base_class', '_extmethods', '_is_keyval',
'_register_paths', '_mynamespace', '_yang_type',
'_defining_module', '_metadata', '_is_config', '_empty_tag']
|
|||
| msg11639 (view) | Author: Jeff Allen (jeff.allen) | Date: 2017-10-30.14:48:23 | |
Thanks for bringing this up. I think the explanation in the Stackoverflow post is probably correct. If so, it should be possible to make a toy example, separate from the given library. I do not know of anything that would make _yang_name a special name. Jython attempts to infer readability from the presence of getters and setters in some circumstances. The intention is to make Java Beans into objects with attributes. I'm surprised to see it in a pure Python class, where clearly it ìnterferes with perfectly proper Python. Perhaps a work-around is to add a setter for the troublesome attribute? (Not tried this.) |
|||
| msg11772 (view) | Author: Jeff Allen (jeff.allen) | Date: 2018-03-08.23:10:22 | |
I now think the StackOverflow post is something other than the problem you're having with pyangbind. However, I am unable to reproduce anything like this. If you can provide an isolated demonstration, we could re-open. |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2018-11-04 15:02:46 | jeff.allen | set | status: pending -> closed |
| 2018-03-08 23:10:22 | jeff.allen | set | priority: normal status: open -> pending resolution: invalid messages: + msg11772 |
| 2017-10-30 14:48:24 | jeff.allen | set | type: behaviour messages: + msg11639 nosy: + jeff.allen |
| 2017-10-30 10:58:14 | lucabrasi | set | files: - yangtypes.py |
| 2017-10-28 05:56:47 | lucabrasi | set | title: Python 2.7.1 - Readonly attribute error -> Jython 2.7.1 - Readonly attribute error |
| 2017-10-28 05:47:56 | lucabrasi | set | messages: + msg11634 |
| 2017-10-28 03:22:03 | lucabrasi | create | |
Supported by Python Software Foundation,
Powered by Roundup