You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.4 KiB
48 lines
1.4 KiB
# encoding: utf-8
|
|
|
|
"""
|
|
Objects shared by opc modules.
|
|
"""
|
|
|
|
from __future__ import absolute_import, print_function, unicode_literals
|
|
|
|
|
|
class CaseInsensitiveDict(dict):
|
|
"""
|
|
Mapping type that behaves like dict except that it matches without respect
|
|
to the case of the key. E.g. cid['A'] == cid['a']. Note this is not
|
|
general-purpose, just complete enough to satisfy opc package needs. It
|
|
assumes str keys, and that it is created empty; keys passed in constructor
|
|
are not accounted for
|
|
"""
|
|
def __contains__(self, key):
|
|
return super(CaseInsensitiveDict, self).__contains__(key.lower())
|
|
|
|
def __getitem__(self, key):
|
|
return super(CaseInsensitiveDict, self).__getitem__(key.lower())
|
|
|
|
def __setitem__(self, key, value):
|
|
return super(CaseInsensitiveDict, self).__setitem__(
|
|
key.lower(), value
|
|
)
|
|
|
|
|
|
def lazyproperty(f):
|
|
"""
|
|
@lazyprop decorator. Decorated method will be called only on first access
|
|
to calculate a cached property value. After that, the cached value is
|
|
returned.
|
|
"""
|
|
cache_attr_name = '_%s' % f.__name__ # like '_foobar' for prop 'foobar'
|
|
docstring = f.__doc__
|
|
|
|
def get_prop_value(obj):
|
|
try:
|
|
return getattr(obj, cache_attr_name)
|
|
except AttributeError:
|
|
value = f(obj)
|
|
setattr(obj, cache_attr_name, value)
|
|
return value
|
|
|
|
return property(get_prop_value, doc=docstring)
|