# -*- coding: utf-8 -*-
import sys

PY2 = sys.version_info[0] == 2


class LazyProxy(object):
    """ 一个Python对象的代理，从`werkzeug.local`中抄过来的 """

    __slots__ = ("__getter", "__name__")

    def __init__(self, getter, name=None):
        object.__setattr__(self, "_LazyProxy__getter", getter)
        object.__setattr__(self, "__name__", name)

    def _get_object(self):
        return self.__getter()

    @property
    def __dict__(self):
        try:
            return self._get_object().__dict__
        except RuntimeError:
            raise AttributeError('__dict__')

    def __repr__(self):
        try:
            obj = self._get_object()
        except RuntimeError:
            return "<%s unbound>" % self.__class__.__name__
        return repr(obj)

    def __bool__(self):
        try:
            return bool(self._get_object())
        except RuntimeError:
            return False

    def __unicode__(self):
        try:
            return unicode(self._get_object())
        except RuntimeError:
            return repr(self)

    def __dir__(self):
        try:
            return dir(self._get_object())
        except RuntimeError:
            return []

    def __getattr__(self, name):
        if name == "__members__":
            return dir(self._get_object())
        return getattr(self._get_object(), name)

    def __setitem__(self, key, value):
        self._get_object()[key] = value

    def __delitem__(self, key):
        del self._get_object()[key]

    if PY2:
        def __getslice__(self, i, j):
            return self._get_object()[i:j]

        def __setslice__(self, i, j, seq):
            self._get_object()[i:j] = seq

        def __delslide__(self, i, j):
            del self._get_object()[i:j]

    __setattr__ = lambda x, n, v: setattr(x._get_object(), n, v)
    __delattr__ = lambda x, n: delattr(x._get_object(), n)
    __str__ = lambda x: str(x._get_object())
    __lt__ = lambda x, o: x._get_object() < o
    __le__ = lambda x, o: x._get_object() <= o
    __eq__ = lambda x, o: x._get_object() == o
    __ne__ = lambda x, o: x._get_object() != o
    __gt__ = lambda x, o: x._get_object() > o
    __ge__ = lambda x, o: x._get_object() >= o
    __cmp__ = lambda x, o: cmp(x._get_object(), o)
    __hash__ = lambda x: hash(x._get_object())
    __call__ = lambda x, *a, **kw: x._get_object()(*a, **kw)
    __len__ = lambda x: len(x._get_object())
    __getitem__ = lambda x, i: x._get_object()[i]
    __iter__ = lambda x: iter(x._get_object())
    __contains__ = lambda x, i: i in x._get_object()
    __add__ = lambda x, o: x._get_object() + o
    __sub__ = lambda x, o: x._get_object() - o
    __mul__ = lambda x, o: x._get_object() * o
    __floordiv__ = lambda x, o: x._get_object() // o
    __mod__ = lambda x, o: x._get_object() % o
    __divmod__ = lambda x, o: x._get_object().__divmod__(o)
    __pow__ = lambda x, o: x._get_object() ** o
    __lshift__ = lambda x, o: x._get_object() << o
    __rshift__ = lambda x, o: x._get_object() >> o
    __and__ = lambda x, o: x._get_object() & o
    __xor__ = lambda x, o: x._get_object() ^ o
    __or__ = lambda x, o: x._get_object() | o
    __div__ = lambda x, o: x._get_object().__div__(o)
    __truediv__ = lambda x, o: x._get_object().__truediv__(o)
    __neg__ = lambda x: -(x._get_object())
    __pos__ = lambda x: +(x._get_object())
    __abs__ = lambda x: abs(x._get_object())
    __invert__ = lambda x: ~(x._get_object())
    __complex__ = lambda x: complex(x._get_object())
    __int__ = lambda x: int(x._get_object())
    __long__ = lambda x: long(x._get_object())
    __float__ = lambda x: float(x._get_object())
    __oct__ = lambda x: oct(x._get_object())
    __hex__ = lambda x: hex(x._get_object())
    __index__ = lambda x: x._get_object().__index__()
    __coerce__ = lambda x, o: x._get_object().__coerce__(x, o)
    __enter__ = lambda x: x._get_object().__enter__()
    __exit__ = lambda x, *a, **kw: x._get_object().__exit__(*a, **kw)
    __radd__ = lambda x, o: o + x._get_object()
    __rsub__ = lambda x, o: o - x._get_object()
    __rmul__ = lambda x, o: o * x._get_object()
    __rdiv__ = lambda x, o: o / x._get_object()
    if PY2:
        __rtruediv__ = lambda x, o: x._get_object().__rtruediv__(o)
    else:
        __rtruediv__ = __rdiv__
    __rfloordiv__ = lambda x, o: o // x._get_object()
    __rmod__ = lambda x, o: o % x._get_object()
    __rdivmod__ = lambda x, o: x._get_object().__rdivmod__(o)

# -*- coding: utf-8 -*-
import sys

PY2 = sys.version_info[0] == 2


class LazyProxy(object):
    """ 一个Python对象的代理，从`werkzeug.local`中抄过来的 """

    __slots__ = ("__getter", "__name__")

    def __init__(self, getter, name=None):
        object.__setattr__(self, "_LazyProxy__getter", getter)
        object.__setattr__(self, "__name__", name)

    def _get_object(self):
        return self.__getter()

    @property
    def __dict__(self):
        try:
            return self._get_object().__dict__
        except RuntimeError:
            raise AttributeError('__dict__')

    def __repr__(self):
        try:
            obj = self._get_object()
        except RuntimeError:
            return "<%s unbound>" % self.__class__.__name__
        return repr(obj)

    def __bool__(self):
        try:
            return bool(self._get_object())
        except RuntimeError:
            return False

    def __unicode__(self):
        try:
            return unicode(self._get_object())
        except RuntimeError:
            return repr(self)

    def __dir__(self):
        try:
            return dir(self._get_object())
        except RuntimeError:
            return []

    def __getattr__(self, name):
        if name == "__members__":
            return dir(self._get_object())
        return getattr(self._get_object(), name)

    def __setitem__(self, key, value):
        self._get_object()[key] = value

    def __delitem__(self, key):
        del self._get_object()[key]

    if PY2:
        def __getslice__(self, i, j):
            return self._get_object()[i:j]

        def __setslice__(self, i, j, seq):
            self._get_object()[i:j] = seq

        def __delslide__(self, i, j):
            del self._get_object()[i:j]

    __setattr__ = lambda x, n, v: setattr(x._get_object(), n, v)
    __delattr__ = lambda x, n: delattr(x._get_object(), n)
    __str__ = lambda x: str(x._get_object())
    __lt__ = lambda x, o: x._get_object() < o
    __le__ = lambda x, o: x._get_object() <= o
    __eq__ = lambda x, o: x._get_object() == o
    __ne__ = lambda x, o: x._get_object() != o
    __gt__ = lambda x, o: x._get_object() > o
    __ge__ = lambda x, o: x._get_object() >= o
    __cmp__ = lambda x, o: cmp(x._get_object(), o)
    __hash__ = lambda x: hash(x._get_object())
    __call__ = lambda x, *a, **kw: x._get_object()(*a, **kw)
    __len__ = lambda x: len(x._get_object())
    __getitem__ = lambda x, i: x._get_object()[i]
    __iter__ = lambda x: iter(x._get_object())
    __contains__ = lambda x, i: i in x._get_object()
    __add__ = lambda x, o: x._get_object() + o
    __sub__ = lambda x, o: x._get_object() - o
    __mul__ = lambda x, o: x._get_object() * o
    __floordiv__ = lambda x, o: x._get_object() // o
    __mod__ = lambda x, o: x._get_object() % o
    __divmod__ = lambda x, o: x._get_object().__divmod__(o)
    __pow__ = lambda x, o: x._get_object() ** o
    __lshift__ = lambda x, o: x._get_object() << o
    __rshift__ = lambda x, o: x._get_object() >> o
    __and__ = lambda x, o: x._get_object() & o
    __xor__ = lambda x, o: x._get_object() ^ o
    __or__ = lambda x, o: x._get_object() | o
    __div__ = lambda x, o: x._get_object().__div__(o)
    __truediv__ = lambda x, o: x._get_object().__truediv__(o)
    __neg__ = lambda x: -(x._get_object())
    __pos__ = lambda x: +(x._get_object())
    __abs__ = lambda x: abs(x._get_object())
    __invert__ = lambda x: ~(x._get_object())
    __complex__ = lambda x: complex(x._get_object())
    __int__ = lambda x: int(x._get_object())
    __long__ = lambda x: long(x._get_object())
    __float__ = lambda x: float(x._get_object())
    __oct__ = lambda x: oct(x._get_object())
    __hex__ = lambda x: hex(x._get_object())
    __index__ = lambda x: x._get_object().__index__()
    __coerce__ = lambda x, o: x._get_object().__coerce__(x, o)
    __enter__ = lambda x: x._get_object().__enter__()
    __exit__ = lambda x, *a, **kw: x._get_object().__exit__(*a, **kw)
    __radd__ = lambda x, o: o + x._get_object()
    __rsub__ = lambda x, o: o - x._get_object()
    __rmul__ = lambda x, o: o * x._get_object()
    __rdiv__ = lambda x, o: o / x._get_object()
    if PY2:
        __rtruediv__ = lambda x, o: x._get_object().__rtruediv__(o)
    else:
        __rtruediv__ = __rdiv__
    __rfloordiv__ = lambda x, o: o // x._get_object()
    __rmod__ = lambda x, o: o % x._get_object()
    __rdivmod__ = lambda x, o: x._get_object().__rdivmod__(o)

# -*- coding: utf-8 -*- 一个Python对象的代理，从`werkzeug.local`中抄过来的