diff --git a/CHANGES.rst b/CHANGES.rst
index c264be8..0bcf42b 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,6 +4,11 @@ Changes
 4.1.2 (unreleased)
 ------------------
 
+- Fix `issue 7
+  <https://github.com/zopefoundation/zope.security/issues/7`_: The
+  pure-Python proxy didn't propagate ``TypeError`` from ``__repr__``
+  and ``__str__`` like the C implementation did.
+
 - Fix `issue 27 <https://github.com/zopefoundation/zope.security/issues/27>`_:
   iteration of ``zope.interface.providedBy()`` is now allowed by
   default on all versions of Python. Previously it only worked on
diff --git a/src/zope/security/proxy.py b/src/zope/security/proxy.py
index 302257a..60dcae8 100644
--- a/src/zope/security/proxy.py
+++ b/src/zope/security/proxy.py
@@ -219,6 +219,11 @@ class ProxyPy(PyProxyBase):
     def __str__(self):
         try:
             return _check_name(PyProxyBase.__str__)(self)
+        # The C implementation catches almost all exceptions; the
+        # exception is a TypeError that's raised when the repr returns
+        # the wrong type of object.
+        except TypeError:
+            raise
         except:
             # The C implementation catches all exceptions.
             wrapped = super(PyProxyBase, self).__getattribute__('_wrapped')
@@ -229,8 +234,12 @@ class ProxyPy(PyProxyBase):
     def __repr__(self):
         try:
             return _check_name(PyProxyBase.__repr__)(self)
+        # The C implementation catches almost all exceptions; the
+        # exception is a TypeError that's raised when the repr returns
+        # the wrong type of object.
+        except TypeError:
+            raise
         except:
-            # The C implementation catches all exceptions.
             wrapped = super(PyProxyBase, self).__getattribute__('_wrapped')
             return '<security proxied %s.%s instance at %s>' %(
                 wrapped.__class__.__module__, wrapped.__class__.__name__,

 security proxy breaks python expectation w/ str and repr
In https://bugs.launchpad.net/zope.security/+bug/156762, Barry Warsaw (barry@python.org) reported:

> In Python, when an object has a `__repr__()` but no `__str__()`, and `str()` is called on that object, Python will fall back to calling `__repr__()`, as documented here:
> 
> http://www.python.org/doc/current/ref/customization.html#l2h-179
> 
> ``` python
> >> class Foo(object):
> ... def __repr__(self): return 'my repr'
> ...
> >> repr(Foo())
> 'my repr'
> >> str(Foo())
> 'my repr'
> ```
> 
> However, Zope's security proxy does not mimic this behavior correctly. In the following, `listx` is an object of type `MailingList` which has a `__repr__()` but no `__str__()`:
> 
> ``` python
> >> str(listx)
> '<security proxied canonical.launchpad.database.mailinglist.MailingList instance at 0xa7aca2c>'
> >> repr(listx)
> '<MailingList for team "teamx"; status=ACTIVE at 0xa7aca2c>'
> ```
> 
> The `str(listx)` should print the same thing as `repr(listx)`.

diff --git a/src/zope/security/tests/test_proxy.py b/src/zope/security/tests/test_proxy.py
index ca4a8a3..20f66da 100644
--- a/src/zope/security/tests/test_proxy.py
+++ b/src/zope/security/tests/test_proxy.py
@@ -19,31 +19,10 @@ import sys
 from zope.security._compat import PYTHON2, PYPY, PURE_PYTHON
 
 def _skip_if_not_Py2(testfunc):
-    from functools import update_wrapper
-    if not PYTHON2:
-        def dummy(self):
-            pass
-        update_wrapper(dummy, testfunc)
-        return dummy
-    return testfunc
+    return unittest.skipUnless(PYTHON2, "Only on Py2")(testfunc)
 
 def _skip_if_Py2(testfunc):
-    from functools import update_wrapper
-    if PYTHON2:
-        def dummy(self):
-            pass
-        update_wrapper(dummy, testfunc)
-        return dummy
-    return testfunc
-
-def _skip_if_pypy250(testfunc):
-    from functools import update_wrapper
-    if PYPY and sys.pypy_version_info[:3] == (2,5,0):
-        def dummy(self):
-            pass
-        update_wrapper(dummy, testfunc)
-        return dummy
-    return testfunc
+    return unittest.skipIf(PYTHON2, "Only on Py3")(testfunc)
 
 class ProxyTestBase(object):
 
@@ -168,6 +147,20 @@ class ProxyTestBase(object):
                          '<security proxied %s.object '
                              'instance at %s>' % (_BUILTINS, address))
 
+    def test__str__fails_return(self):
+        from zope.security.interfaces import ForbiddenAttribute
+        class CustomStr(object):
+            def __str__(self):
+                "<CustomStr>" # Docstring, not a return
+
+        target = CustomStr()
+        checker = DummyChecker(ForbiddenAttribute, allowed=('__str__'))
+        proxy = self._makeOne(target, checker)
+        with self.assertRaises(TypeError):
+            str(target)
+        with self.assertRaises(TypeError):
+            str(proxy)
+
     def test___repr___checker_allows_str(self):
         target = object()
         checker = DummyChecker()
@@ -186,6 +179,59 @@ class ProxyTestBase(object):
                          '<security proxied %s.object '
                              'instance at %s>' % (_BUILTINS, address))
 
+    def test__str__falls_through_to_repr_when_both_allowed(self):
+        from zope.security.interfaces import ForbiddenAttribute
+        class CustomRepr(object):
+            def __repr__(self):
+                return "<CustomRepr>"
+
+        target = CustomRepr()
+        checker = DummyChecker(ForbiddenAttribute, allowed=("__str__", '__repr__'))
+        proxy = self._makeOne(target, checker)
+        self.assertEqual(repr(proxy), "<CustomRepr>")
+        self.assertEqual(str(target), "<CustomRepr>")
+        self.assertEqual(str(proxy), str(target))
+
+    def test__str__doesnot_fall_through_to_repr_when_str_not_allowed(self):
+        from zope.security.interfaces import ForbiddenAttribute
+        class CustomRepr(object):
+            def __repr__(self):
+                return "<CustomRepr>"
+
+        target = CustomRepr()
+        checker = DummyChecker(ForbiddenAttribute, allowed=('__repr__'))
+        proxy = self._makeOne(target, checker)
+        self.assertEqual(repr(proxy), "<CustomRepr>")
+        self.assertEqual(str(target), "<CustomRepr>")
+        self.assertIn("<security proxied zope.security", str(proxy))
+
+    def test__str__doesnot_fall_through_to_repr_when_repr_not_allowed(self):
+        from zope.security.interfaces import ForbiddenAttribute
+        class CustomRepr(object):
+            def __repr__(self):
+                return "<CustomRepr>"
+
+        target = CustomRepr()
+        checker = DummyChecker(ForbiddenAttribute, allowed=('__str__'))
+        proxy = self._makeOne(target, checker)
+        self.assertEqual(str(target), "<CustomRepr>")
+        self.assertEqual(str(proxy), str(target))
+        self.assertIn("<security proxied zope.security", repr(proxy))
+
+    def test__str__falls_through_to_repr_but_repr_fails_return(self):
+        from zope.security.interfaces import ForbiddenAttribute
+        class CustomRepr(object):
+            def __repr__(self):
+                "<CustomRepr>" # Docstring, not a return
+
+        target = CustomRepr()
+        checker = DummyChecker(ForbiddenAttribute, allowed=('__repr__'))
+        proxy = self._makeOne(target, checker)
+        with self.assertRaises(TypeError):
+            repr(target)
+        with self.assertRaises(TypeError):
+            repr(proxy)
+
     @_skip_if_not_Py2
     def test___cmp___w_self(self):
         target = object()
@@ -1713,12 +1759,6 @@ class ProxyTests(unittest.TestCase):
         self.assertEqual(self.c, getChecker(self.p))
 
 
-    # XXX: PyPy 2.5.0 has a bug where proxys around types
-    # aren't correctly hashable, which breaks this part of the
-    # test. This is fixed in 2.5.1+, but as of 2015-05-28,
-    # TravisCI still uses 2.5.0.
-
-    @_skip_if_pypy250
     def testProxiedClassicClassAsDictKey(self):
         from zope.security.proxy import ProxyFactory
         class C(object):
@@ -1727,7 +1767,6 @@ class ProxyTests(unittest.TestCase):
         pC = ProxyFactory(C, self.c)
         self.assertEqual(d[pC], d[C])
 
-    @_skip_if_pypy250
     def testProxiedNewClassAsDictKey(self):
         from zope.security.proxy import ProxyFactory
         class C(object):

pip install -e .[dev]
parse_log_pytest
pytest
pytest pytest-cov pytest-xdist pytest-mock pytest-asyncio pytest
apt-get update apt-get install -y gcc
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
certifi==2021.5.30
coverage==6.2
execnet==1.9.0
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
pytest-asyncio==0.16.0
pytest-cov==4.0.0
pytest-mock==3.6.1
pytest-xdist==3.0.2
six==1.17.0
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
tomli==1.2.3
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work
zope.component==5.1.0
zope.event==4.6
zope.hookable==5.4
zope.i18nmessageid==5.1.1
zope.interface==5.5.2
zope.location==4.3
zope.proxy==4.6.1
zope.schema==6.2.1
-e git+https://github.com/zopefoundation/zope.security.git@f2de4625c116085404958724468899dbe784bce6#egg=zope.security

name: zope.security
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - coverage==6.2
      - execnet==1.9.0
      - pytest-asyncio==0.16.0
      - pytest-cov==4.0.0
      - pytest-mock==3.6.1
      - pytest-xdist==3.0.2
      - six==1.17.0
      - tomli==1.2.3
      - zope-component==5.1.0
      - zope-event==4.6
      - zope-hookable==5.4
      - zope-i18nmessageid==5.1.1
      - zope-interface==5.5.2
      - zope-location==4.3
      - zope-proxy==4.6.1
      - zope-schema==6.2.1
prefix: /opt/conda/envs/zope.security

src/zope/security/tests/test_proxy.py::ProxyPyTests::test__str__fails_return src/zope/security/tests/test_proxy.py::ProxyPyTests::test__str__falls_through_to_repr_but_repr_fails_return
src/zope/security/tests/test_proxy.py::ProxyCTests::test___abs___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___abs___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___add___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___add___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___and___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___and___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___bool___ src/zope/security/tests/test_proxy.py::ProxyCTests::test___call___w_checker_forbidden_attribute src/zope/security/tests/test_proxy.py::ProxyCTests::test___call___w_checker_ok src/zope/security/tests/test_proxy.py::ProxyCTests::test___call___w_checker_unauthorized src/zope/security/tests/test_proxy.py::ProxyCTests::test___contains___hit_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___contains___miss_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___contains___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___delattr___w_checker_forbidden_attribute src/zope/security/tests/test_proxy.py::ProxyCTests::test___delattr___w_checker_ok src/zope/security/tests/test_proxy.py::ProxyCTests::test___delattr___w_checker_unauthorized src/zope/security/tests/test_proxy.py::ProxyCTests::test___divmod___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___divmod___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___float___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___float___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___floordiv___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___floordiv___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___getattr___w_checker_forbidden_attribute src/zope/security/tests/test_proxy.py::ProxyCTests::test___getattr___w_checker_ok src/zope/security/tests/test_proxy.py::ProxyCTests::test___getattr___w_checker_unauthorized src/zope/security/tests/test_proxy.py::ProxyCTests::test___getitem___mapping_hit_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___getitem___mapping_miss_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___getitem___mapping_w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___getitem___sequence_hit_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___getitem___sequence_miss_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___getitem___sequence_w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___hash___w_self src/zope/security/tests/test_proxy.py::ProxyCTests::test___iadd___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___iadd___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___iadd___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___iand___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___iand___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___iand___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___ifloordiv___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___ifloordiv___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___ifloordiv___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___ilshift___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___ilshift___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___ilshift___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___imod___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___imod___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___imod___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___imul___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___imul___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___imul___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___int___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___int___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___invert___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___invert___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___ior___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___ior___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___ior___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___ipow___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___ipow___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___ipow___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___irshift___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___irshift___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___irshift___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___isub___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___isub___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___isub___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___itruediv___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___itruediv___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___itruediv___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___ixor___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___ixor___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___ixor___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___len___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___len___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___lshift___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___lshift___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___mod___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___mod___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___mul___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___mul___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___neg___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___neg___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___or___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___or___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___pos___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___pos___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___pow___w_x_proxied_allowed src/zope/security/tests/test_proxy.py::ProxyCTests::test___pow___w_x_proxied_forbidden src/zope/security/tests/test_proxy.py::ProxyCTests::test___pow___w_y_proxied_allowed src/zope/security/tests/test_proxy.py::ProxyCTests::test___pow___w_y_proxied_forbidden src/zope/security/tests/test_proxy.py::ProxyCTests::test___pow___w_z_proxied_allowed src/zope/security/tests/test_proxy.py::ProxyCTests::test___pow___w_z_proxied_forbidden src/zope/security/tests/test_proxy.py::ProxyCTests::test___repr___checker_allows_str src/zope/security/tests/test_proxy.py::ProxyCTests::test___repr___checker_forbids_str src/zope/security/tests/test_proxy.py::ProxyCTests::test___rshift___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___rshift___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___setattr___w_checker_forbidden_attribute src/zope/security/tests/test_proxy.py::ProxyCTests::test___setattr___w_checker_ok src/zope/security/tests/test_proxy.py::ProxyCTests::test___setattr___w_checker_unauthorized src/zope/security/tests/test_proxy.py::ProxyCTests::test___setitem___mapping_hit_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___setitem___mapping_w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___setitem___sequence_hit_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___setitem___sequence_miss_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___setitem___sequence_w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___str___checker_allows_str src/zope/security/tests/test_proxy.py::ProxyCTests::test___str___checker_forbids_str src/zope/security/tests/test_proxy.py::ProxyCTests::test___sub___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___sub___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___truediv___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___truediv___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test___xor___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyCTests::test___xor___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyCTests::test__str__doesnot_fall_through_to_repr_when_repr_not_allowed src/zope/security/tests/test_proxy.py::ProxyCTests::test__str__doesnot_fall_through_to_repr_when_str_not_allowed src/zope/security/tests/test_proxy.py::ProxyCTests::test__str__fails_return src/zope/security/tests/test_proxy.py::ProxyCTests::test__str__falls_through_to_repr_but_repr_fails_return src/zope/security/tests/test_proxy.py::ProxyCTests::test__str__falls_through_to_repr_when_both_allowed src/zope/security/tests/test_proxy.py::ProxyCTests::test_binops src/zope/security/tests/test_proxy.py::ProxyCTests::test_ctor_w_checker_None src/zope/security/tests/test_proxy.py::ProxyPyTests::test___abs___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___abs___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___add___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___add___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___and___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___and___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___bool___ src/zope/security/tests/test_proxy.py::ProxyPyTests::test___call___w_checker_forbidden_attribute src/zope/security/tests/test_proxy.py::ProxyPyTests::test___call___w_checker_ok src/zope/security/tests/test_proxy.py::ProxyPyTests::test___call___w_checker_unauthorized src/zope/security/tests/test_proxy.py::ProxyPyTests::test___contains___hit_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___contains___miss_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___contains___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___delattr___w__checker src/zope/security/tests/test_proxy.py::ProxyPyTests::test___delattr___w__wrapped src/zope/security/tests/test_proxy.py::ProxyPyTests::test___delattr___w_checker_forbidden_attribute src/zope/security/tests/test_proxy.py::ProxyPyTests::test___delattr___w_checker_ok src/zope/security/tests/test_proxy.py::ProxyPyTests::test___delattr___w_checker_unauthorized src/zope/security/tests/test_proxy.py::ProxyPyTests::test___divmod___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___divmod___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___float___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___float___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___floordiv___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___floordiv___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___getattr___w_checker_forbidden_attribute src/zope/security/tests/test_proxy.py::ProxyPyTests::test___getattr___w_checker_ok src/zope/security/tests/test_proxy.py::ProxyPyTests::test___getattr___w_checker_unauthorized src/zope/security/tests/test_proxy.py::ProxyPyTests::test___getitem___mapping_hit_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___getitem___mapping_miss_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___getitem___mapping_w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___getitem___sequence_hit_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___getitem___sequence_miss_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___getitem___sequence_w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___hash___w_self src/zope/security/tests/test_proxy.py::ProxyPyTests::test___iadd___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___iadd___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___iadd___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___iand___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___iand___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___iand___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___ifloordiv___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___ifloordiv___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___ifloordiv___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___ilshift___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___ilshift___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___ilshift___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___imod___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___imod___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___imod___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___imul___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___imul___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___imul___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___int___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___int___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___invert___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___invert___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___ior___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___ior___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___ior___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___ipow___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___ipow___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___ipow___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___irshift___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___irshift___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___irshift___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___isub___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___isub___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___isub___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___itruediv___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___itruediv___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___itruediv___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___ixor___inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___ixor___not_inplace_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___ixor___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___len___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___len___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___lshift___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___lshift___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___mod___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___mod___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___mul___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___mul___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___neg___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___neg___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___or___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___or___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___pos___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___pos___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___pow___w_x_proxied_allowed src/zope/security/tests/test_proxy.py::ProxyPyTests::test___pow___w_x_proxied_forbidden src/zope/security/tests/test_proxy.py::ProxyPyTests::test___pow___w_y_proxied_allowed src/zope/security/tests/test_proxy.py::ProxyPyTests::test___pow___w_y_proxied_forbidden src/zope/security/tests/test_proxy.py::ProxyPyTests::test___pow___w_z_proxied_allowed src/zope/security/tests/test_proxy.py::ProxyPyTests::test___pow___w_z_proxied_forbidden src/zope/security/tests/test_proxy.py::ProxyPyTests::test___repr___checker_allows_str src/zope/security/tests/test_proxy.py::ProxyPyTests::test___repr___checker_forbids_str src/zope/security/tests/test_proxy.py::ProxyPyTests::test___rshift___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___rshift___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___setattr___w_checker_forbidden_attribute src/zope/security/tests/test_proxy.py::ProxyPyTests::test___setattr___w_checker_ok src/zope/security/tests/test_proxy.py::ProxyPyTests::test___setattr___w_checker_unauthorized src/zope/security/tests/test_proxy.py::ProxyPyTests::test___setitem___mapping_hit_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___setitem___mapping_w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___setitem___sequence_hit_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___setitem___sequence_miss_w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___setitem___sequence_w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___str___checker_allows_str src/zope/security/tests/test_proxy.py::ProxyPyTests::test___str___checker_forbids_str src/zope/security/tests/test_proxy.py::ProxyPyTests::test___sub___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___sub___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___truediv___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___truediv___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test___xor___w_checker_allows src/zope/security/tests/test_proxy.py::ProxyPyTests::test___xor___w_checker_forbids src/zope/security/tests/test_proxy.py::ProxyPyTests::test__str__doesnot_fall_through_to_repr_when_repr_not_allowed src/zope/security/tests/test_proxy.py::ProxyPyTests::test__str__doesnot_fall_through_to_repr_when_str_not_allowed src/zope/security/tests/test_proxy.py::ProxyPyTests::test__str__falls_through_to_repr_when_both_allowed src/zope/security/tests/test_proxy.py::ProxyPyTests::test_binops src/zope/security/tests/test_proxy.py::ProxyPyTests::test_ctor_w_checker src/zope/security/tests/test_proxy.py::ProxyPyTests::test_ctor_w_checker_None src/zope/security/tests/test_proxy.py::ProxyPyTests::test_getObjectPy_initial_conditions src/zope/security/tests/test_proxy.py::ProxyPyTests::test_wrapper_checker_unaccessible src/zope/security/tests/test_proxy.py::Test_getTestProxyItems::test_w_empty_checker src/zope/security/tests/test_proxy.py::Test_getTestProxyItems::test_w_non_empty_checker src/zope/security/tests/test_proxy.py::Test_isinstance::test_w_proxied_object src/zope/security/tests/test_proxy.py::Test_isinstance::test_w_unproxied_object src/zope/security/tests/test_proxy.py::ProxyTests::testCallFail src/zope/security/tests/test_proxy.py::ProxyTests::testCallOK src/zope/security/tests/test_proxy.py::ProxyTests::testContainsFail src/zope/security/tests/test_proxy.py::ProxyTests::testContainsOK src/zope/security/tests/test_proxy.py::ProxyTests::testDelItemFail src/zope/security/tests/test_proxy.py::ProxyTests::testDelItemOK src/zope/security/tests/test_proxy.py::ProxyTests::testDerivation src/zope/security/tests/test_proxy.py::ProxyTests::testGetAttrFail src/zope/security/tests/test_proxy.py::ProxyTests::testGetAttrOK src/zope/security/tests/test_proxy.py::ProxyTests::testGetChecker src/zope/security/tests/test_proxy.py::ProxyTests::testGetItemFail src/zope/security/tests/test_proxy.py::ProxyTests::testGetItemOK src/zope/security/tests/test_proxy.py::ProxyTests::testGetObject src/zope/security/tests/test_proxy.py::ProxyTests::testHashOK src/zope/security/tests/test_proxy.py::ProxyTests::testIterFail src/zope/security/tests/test_proxy.py::ProxyTests::testIterOK src/zope/security/tests/test_proxy.py::ProxyTests::testLenFail src/zope/security/tests/test_proxy.py::ProxyTests::testLenOK src/zope/security/tests/test_proxy.py::ProxyTests::testNextFail src/zope/security/tests/test_proxy.py::ProxyTests::testNextOK src/zope/security/tests/test_proxy.py::ProxyTests::testNonzeroOK src/zope/security/tests/test_proxy.py::ProxyTests::testProxiedClassicClassAsDictKey src/zope/security/tests/test_proxy.py::ProxyTests::testProxiedNewClassAsDictKey src/zope/security/tests/test_proxy.py::ProxyTests::testRepr src/zope/security/tests/test_proxy.py::ProxyTests::testRichCompareOK src/zope/security/tests/test_proxy.py::ProxyTests::testSetAttrFail src/zope/security/tests/test_proxy.py::ProxyTests::testSetAttrOK src/zope/security/tests/test_proxy.py::ProxyTests::testSetItemFail src/zope/security/tests/test_proxy.py::ProxyTests::testSetItemOK src/zope/security/tests/test_proxy.py::ProxyTests::testSetSliceFail src/zope/security/tests/test_proxy.py::ProxyTests::testSetSliceOK src/zope/security/tests/test_proxy.py::ProxyTests::testSliceFail src/zope/security/tests/test_proxy.py::ProxyTests::testStr src/zope/security/tests/test_proxy.py::ProxyTests::test_binops src/zope/security/tests/test_proxy.py::ProxyTests::test_inplace src/zope/security/tests/test_proxy.py::ProxyTests::test_unops src/zope/security/tests/test_proxy.py::test_using_mapping_slots_hack src/zope/security/tests/test_proxy.py::LocationProxySecurityCheckerTests::test_LocationProxy_gets_a_security_checker_when_importing_z_security src/zope/security/tests/test_proxy.py::test_suite
CHANGES.rst src/zope/security/proxy.py
CHANGES.rst src/zope/security/proxy.py