diff --git a/CHANGES.rst b/CHANGES.rst
index 70f85e9..b86e14d 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -45,6 +45,12 @@
 
   See `issue 3 <https://github.com/zopefoundation/zope.interface/issues/3>`_.
 
+- Make the internal singleton object returned by APIs like
+  ``implementedBy`` and ``directlyProvidedBy`` for objects that
+  implement or provide no interfaces more immutable. Previously an
+  internal cache could be mutated. See `issue 204
+  <https://github.com/zopefoundation/zope.interface/issues/204>`_.
+
 5.0.2 (2020-03-30)
 ==================
 
diff --git a/src/zope/interface/declarations.py b/src/zope/interface/declarations.py
index b42c906..d77c824 100644
--- a/src/zope/interface/declarations.py
+++ b/src/zope/interface/declarations.py
@@ -195,6 +195,18 @@ class _ImmutableDeclaration(Declaration):
         # object, and that includes a method.)
         return _ImmutableDeclaration
 
+    @property
+    def _v_attrs(self):
+        # _v_attrs is not a public, documented property, but some client
+        # code uses it anyway as a convenient place to cache things. To keep
+        # the empty declaration truly immutable, we must ignore that. That includes
+        # ignoring assignments as well.
+        return {}
+
+    @_v_attrs.setter
+    def _v_attrs(self, new_attrs):
+        pass
+
 
 ##############################################################################
 #

ImmutableDeclaration: Allows mutable _v_attrs
Some user code likes to assign to `_v_attrs` and/or write into the dictionary to piggyback on caching. Since ImmutableDeclaration provides no way to clear `_v_attrs` (it assumes it stays None), this can lead to incorrect results. 

This is not a regression in 5.0 but a pre-existing problem.

Proposal: Make `ImmutableDeclaration` use a property to always return a fresh dictionary for `_v_attrs`.
diff --git a/src/zope/interface/tests/test_declarations.py b/src/zope/interface/tests/test_declarations.py
index 83815d7..fc2ab68 100644
--- a/src/zope/interface/tests/test_declarations.py
+++ b/src/zope/interface/tests/test_declarations.py
@@ -122,6 +122,20 @@ class EmptyDeclarationTests(unittest.TestCase):
         decl = self._getEmpty()
         self.assertEqual(decl.__iro__, (Interface,))
 
+    def test_get(self):
+        decl = self._getEmpty()
+        self.assertIsNone(decl.get('attr'))
+        self.assertEqual(decl.get('abc', 'def'), 'def')
+        # It's a positive cache only (when it even exists)
+        # so this added nothing.
+        self.assertFalse(decl._v_attrs)
+
+    def test_changed_w_existing__v_attrs(self):
+        decl = self._getEmpty()
+        decl._v_attrs = object()
+        decl.changed(decl)
+        self.assertFalse(decl._v_attrs)
+
 
 class DeclarationTests(EmptyDeclarationTests):
 
@@ -153,12 +167,6 @@ class DeclarationTests(EmptyDeclarationTests):
         decl.changed(decl) # doesn't raise
         self.assertIsNone(decl._v_attrs)
 
-    def test_changed_w_existing__v_attrs(self):
-        decl = self._makeOne()
-        decl._v_attrs = object()
-        decl.changed(decl)
-        self.assertIsNone(decl._v_attrs)
-
     def test___contains__w_self(self):
         decl = self._makeOne()
         self.assertNotIn(decl, decl)
@@ -335,6 +343,19 @@ class TestImmutableDeclaration(EmptyDeclarationTests):
         self.assertIsNone(self._getEmpty().get('name'))
         self.assertEqual(self._getEmpty().get('name', 42), 42)
 
+    def test_v_attrs(self):
+        decl = self._getEmpty()
+        self.assertEqual(decl._v_attrs, {})
+
+        decl._v_attrs['attr'] = 42
+        self.assertEqual(decl._v_attrs, {})
+        self.assertIsNone(decl.get('attr'))
+
+        attrs = decl._v_attrs = {}
+        attrs['attr'] = 42
+        self.assertEqual(decl._v_attrs, {})
+        self.assertIsNone(decl.get('attr'))
+
 
 class TestImplements(NameAndModuleComparisonTestsMixin,
                      unittest.TestCase):

pip install -e .[dev]
parse_log_pytest
pytest
Sphinx repoze.sphinx.autointerface coverage pytest
apt-get update apt-get install -y gcc
3.8
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
babel==2.17.0
certifi==2025.1.31
charset-normalizer==3.4.1
coverage==7.6.1
docutils==0.20.1
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
idna==3.10
imagesize==1.4.1
importlib_metadata==8.5.0
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
Jinja2==3.1.6
MarkupSafe==2.1.5
packaging @ file:///croot/packaging_1720101850331/work
pluggy @ file:///tmp/build/80754af9/pluggy_1648042571233/work
Pygments==2.19.1
pytest @ file:///croot/pytest_1717793244625/work
pytz==2025.2
repoze.sphinx.autointerface==1.0.0
requests==2.32.3
snowballstemmer==2.2.0
Sphinx==7.1.2
sphinxcontrib-applehelp==1.0.4
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.1
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
urllib3==2.2.3
zipp==3.20.2
-e git+https://github.com/zopefoundation/zope.interface.git@a404e5fed4766625b564de558942dd4efd979e89#egg=zope.interface

name: zope.interface
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
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py38h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.1=py38h06a4308_0
  - pip=24.2=py38h06a4308_0
  - pluggy=1.0.0=py38h06a4308_1
  - pytest=7.4.4=py38h06a4308_0
  - python=3.8.20=he870216_0
  - readline=8.2=h5eee18b_0
  - setuptools=75.1.0=py38h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py38h06a4308_0
  - wheel=0.44.0=py38h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - babel==2.17.0
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - coverage==7.6.1
      - docutils==0.20.1
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==8.5.0
      - jinja2==3.1.6
      - markupsafe==2.1.5
      - pygments==2.19.1
      - pytz==2025.2
      - repoze-sphinx-autointerface==1.0.0
      - requests==2.32.3
      - snowballstemmer==2.2.0
      - sphinx==7.1.2
      - sphinxcontrib-applehelp==1.0.4
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.1
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - urllib3==2.2.3
      - zipp==3.20.2
prefix: /opt/conda/envs/zope.interface

src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_changed_w_existing__v_attrs src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_get src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_v_attrs
src/zope/interface/tests/test_declarations.py::NamedTests::test_class src/zope/interface/tests/test_declarations.py::NamedTests::test_function src/zope/interface/tests/test_declarations.py::NamedTests::test_instance src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test___contains___empty src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test___iro___ src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test___iter___empty src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test___sro___ src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test_changed_w_existing__v_attrs src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test_extends_empty src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test_flattened_empty src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test_get src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test_interfaces_empty src/zope/interface/tests/test_declarations.py::DeclarationTests::test___add___related_interface src/zope/interface/tests/test_declarations.py::DeclarationTests::test___add___unrelated_interface src/zope/interface/tests/test_declarations.py::DeclarationTests::test___contains___empty src/zope/interface/tests/test_declarations.py::DeclarationTests::test___contains__w_base_interface src/zope/interface/tests/test_declarations.py::DeclarationTests::test___contains__w_self src/zope/interface/tests/test_declarations.py::DeclarationTests::test___contains__w_unrelated_iface src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iro___ src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iter___empty src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iter___inheritance src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iter___multiple_bases src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iter___single_base src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iter___w_nested_sequence_overlap src/zope/interface/tests/test_declarations.py::DeclarationTests::test___sro___ src/zope/interface/tests/test_declarations.py::DeclarationTests::test___sub___related_interface src/zope/interface/tests/test_declarations.py::DeclarationTests::test___sub___related_interface_by_inheritance src/zope/interface/tests/test_declarations.py::DeclarationTests::test___sub___unrelated_interface src/zope/interface/tests/test_declarations.py::DeclarationTests::test_changed_w_existing__v_attrs src/zope/interface/tests/test_declarations.py::DeclarationTests::test_changed_wo_existing__v_attrs src/zope/interface/tests/test_declarations.py::DeclarationTests::test_ctor_no_bases src/zope/interface/tests/test_declarations.py::DeclarationTests::test_ctor_w_implements_in_bases src/zope/interface/tests/test_declarations.py::DeclarationTests::test_ctor_w_interface_in_bases src/zope/interface/tests/test_declarations.py::DeclarationTests::test_extends_empty src/zope/interface/tests/test_declarations.py::DeclarationTests::test_flattened_empty src/zope/interface/tests/test_declarations.py::DeclarationTests::test_flattened_inheritance src/zope/interface/tests/test_declarations.py::DeclarationTests::test_flattened_multiple_bases src/zope/interface/tests/test_declarations.py::DeclarationTests::test_flattened_single_base src/zope/interface/tests/test_declarations.py::DeclarationTests::test_flattened_w_nested_sequence_overlap src/zope/interface/tests/test_declarations.py::DeclarationTests::test_get src/zope/interface/tests/test_declarations.py::DeclarationTests::test_interfaces_empty src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test___contains___empty src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test___iro___ src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test___iter___empty src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test___sro___ src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test__bases__ src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_change__bases__ src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_changed src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_dependents src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_extends_always_false src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_extends_empty src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_flattened_empty src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_get_always_default src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_interfaces_empty src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_pickle src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_singleton src/zope/interface/tests/test_declarations.py::TestImplements::test___reduce__ src/zope/interface/tests/test_declarations.py::TestImplements::test___repr__ src/zope/interface/tests/test_declarations.py::TestImplements::test__ge__NotImplemented src/zope/interface/tests/test_declarations.py::TestImplements::test__gt__NotImplemented src/zope/interface/tests/test_declarations.py::TestImplements::test__le__NotImplemented src/zope/interface/tests/test_declarations.py::TestImplements::test__lt__NotImplemented src/zope/interface/tests/test_declarations.py::TestImplements::test_changed_deletes_super_cache src/zope/interface/tests/test_declarations.py::TestImplements::test_changed_does_not_add_super_cache src/zope/interface/tests/test_declarations.py::TestImplements::test_ctor_no_bases src/zope/interface/tests/test_declarations.py::TestImplements::test_proxy_equality src/zope/interface/tests/test_declarations.py::TestImplements::test_sort src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_builtins_added_to_cache src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_builtins_w_existing_cache src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_w_existing_not_Implements src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_wo_existing_Implements_cant_assign___implemented__ src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_wo_existing_Implements_w_registrations src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_wo_existing_Implements_wo_registrations src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_no_assertions src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_oldstyle_class_no_assertions src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_multi_level_multi_inheritance src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_when_base_doesnt_implement_interface src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_when_base_implements_interface src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_when_base_implements_interface_diamond src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_when_base_is_object src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_when_parent_implements_interface_diamond src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_w_None_no_bases_not_factory src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_w_None_no_bases_w_class src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_w_None_no_bases_w_factory src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_w_existing_attr_as_Implements src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_builtins_added_to_cache src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_builtins_w_existing_cache src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_dictless_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_dictless_w_existing_not_Implements src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_dictless_wo_existing_Implements_cant_assign___implemented__ src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_dictless_wo_existing_Implements_w_registrations src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_dictless_wo_existing_Implements_wo_registrations src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_no_assertions src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_oldstyle_class_no_assertions src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_optimizations src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_multi_level_multi_inheritance src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_when_base_doesnt_implement_interface src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_when_base_implements_interface src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_when_base_implements_interface_diamond src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_when_base_is_object src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_when_parent_implements_interface_diamond src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_w_None_no_bases_not_factory src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_w_None_no_bases_w_class src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_w_None_no_bases_w_factory src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_w_existing_attr_as_Implements src/zope/interface/tests/test_declarations.py::Test_classImplementsOnly::test_no_existing src/zope/interface/tests/test_declarations.py::Test_classImplementsOnly::test_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_classImplements::test_no_existing src/zope/interface/tests/test_declarations.py::Test_classImplements::test_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_classImplements::test_w_existing_Implements_w_bases src/zope/interface/tests/test_declarations.py::Test__implements_advice::test_no_existing_implements src/zope/interface/tests/test_declarations.py::Test_implementer::test_newstyle_class src/zope/interface/tests/test_declarations.py::Test_implementer::test_nonclass_can_assign_attr src/zope/interface/tests/test_declarations.py::Test_implementer::test_nonclass_cannot_assign_attr src/zope/interface/tests/test_declarations.py::Test_implementer::test_oldstyle_class src/zope/interface/tests/test_declarations.py::Test_implementer_only::test_function src/zope/interface/tests/test_declarations.py::Test_implementer_only::test_method src/zope/interface/tests/test_declarations.py::Test_implementer_only::test_newstyle_class src/zope/interface/tests/test_declarations.py::Test_implementer_only::test_oldstyle_class src/zope/interface/tests/test_declarations.py::Test_implementsOnly::test_called_once_from_class_w_bases src/zope/interface/tests/test_declarations.py::Test_implementsOnly::test_simple src/zope/interface/tests/test_declarations.py::Test_implements::test_called_from_function src/zope/interface/tests/test_declarations.py::Test_implements::test_called_once_from_class src/zope/interface/tests/test_declarations.py::Test_implements::test_called_twice_from_class src/zope/interface/tests/test_declarations.py::ProvidesClassTests::test___get___class src/zope/interface/tests/test_declarations.py::ProvidesClassTests::test___get___instance src/zope/interface/tests/test_declarations.py::ProvidesClassTests::test___reduce__ src/zope/interface/tests/test_declarations.py::ProvidesClassTests::test__repr__ src/zope/interface/tests/test_declarations.py::ProvidesClassTests::test_simple_class_one_interface src/zope/interface/tests/test_declarations.py::Test_Provides::test_no_cached_spec src/zope/interface/tests/test_declarations.py::Test_Provides::test_w_cached_spec src/zope/interface/tests/test_declarations.py::Test_directlyProvides::test_w_class src/zope/interface/tests/test_declarations.py::Test_directlyProvides::test_w_classless_object src/zope/interface/tests/test_declarations.py::Test_directlyProvides::test_w_normal_object src/zope/interface/tests/test_declarations.py::Test_alsoProvides::test_w_existing_provides src/zope/interface/tests/test_declarations.py::Test_alsoProvides::test_wo_existing_provides src/zope/interface/tests/test_declarations.py::Test_noLongerProvides::test_w_existing_provides_hit src/zope/interface/tests/test_declarations.py::Test_noLongerProvides::test_w_existing_provides_miss src/zope/interface/tests/test_declarations.py::Test_noLongerProvides::test_w_iface_implemented_by_class src/zope/interface/tests/test_declarations.py::Test_noLongerProvides::test_wo_existing_provides src/zope/interface/tests/test_declarations.py::ClassProvidesBaseFallbackTests::test_w_different_class src/zope/interface/tests/test_declarations.py::ClassProvidesBaseFallbackTests::test_w_same_class_via_class src/zope/interface/tests/test_declarations.py::ClassProvidesBaseFallbackTests::test_w_same_class_via_instance src/zope/interface/tests/test_declarations.py::ClassProvidesBaseTests::test_optimizations src/zope/interface/tests/test_declarations.py::ClassProvidesBaseTests::test_w_different_class src/zope/interface/tests/test_declarations.py::ClassProvidesBaseTests::test_w_same_class_via_class src/zope/interface/tests/test_declarations.py::ClassProvidesBaseTests::test_w_same_class_via_instance src/zope/interface/tests/test_declarations.py::ClassProvidesTests::test___reduce__ src/zope/interface/tests/test_declarations.py::ClassProvidesTests::test__repr__ src/zope/interface/tests/test_declarations.py::ClassProvidesTests::test_w_simple_metaclass src/zope/interface/tests/test_declarations.py::Test_directlyProvidedBy::test_w_declarations_in_class_but_not_instance src/zope/interface/tests/test_declarations.py::Test_directlyProvidedBy::test_w_declarations_in_instance_and_class src/zope/interface/tests/test_declarations.py::Test_directlyProvidedBy::test_w_declarations_in_instance_but_not_class src/zope/interface/tests/test_declarations.py::Test_directlyProvidedBy::test_wo_declarations_in_class_or_instance src/zope/interface/tests/test_declarations.py::Test_classProvides::test_called_from_function src/zope/interface/tests/test_declarations.py::Test_classProvides::test_called_once_from_class src/zope/interface/tests/test_declarations.py::Test_classProvides::test_called_twice_from_class src/zope/interface/tests/test_declarations.py::Test_provider::test_w_class src/zope/interface/tests/test_declarations.py::Test_moduleProvides::test_called_from_class src/zope/interface/tests/test_declarations.py::Test_moduleProvides::test_called_from_function src/zope/interface/tests/test_declarations.py::Test_moduleProvides::test_called_once_from_module_scope src/zope/interface/tests/test_declarations.py::Test_moduleProvides::test_called_twice_from_module_scope src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_catches_only_AttributeError_on_class src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_catches_only_AttributeError_on_provides src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_existing_provides src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_existing_provides_is_not_spec src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_existing_provides_is_spec src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_raises_AttributeError_when_provides_fails_type_check_AttributeError src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_raises_AttributeError_when_provides_fails_type_check_RuntimeError src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_wo_existing_provides_classless src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_wo_provides_on_class_w_implements src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_wo_provides_on_class_wo_implements src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_catches_only_AttributeError_on_class src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_catches_only_AttributeError_on_provides src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_existing_provides src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_existing_provides_is_not_spec src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_existing_provides_is_spec src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_optimizations src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_raises_AttributeError_when_provides_fails_type_check_AttributeError src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_raises_AttributeError_when_provides_fails_type_check_RuntimeError src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_wo_existing_provides_classless src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_wo_provides_on_class_w_implements src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_wo_provides_on_class_wo_implements src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_catches_only_AttributeError_on_class src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_catches_only_AttributeError_on_providedBy src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_super_multi_level_multi_inheritance src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_super_when_base_doesnt_implement_interface src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_super_when_base_implements_interface src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_super_when_base_is_object src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_super_when_object_directly_provides src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_invalid_spec src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_invalid_spec_class_w_implements src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_invalid_spec_w_provides_diff_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_invalid_spec_w_provides_no_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_invalid_spec_w_provides_same_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_valid_spec src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_wo_providedBy_on_class_wo_implements src/zope/interface/tests/test_declarations.py::Test_providedBy::test_catches_only_AttributeError_on_class src/zope/interface/tests/test_declarations.py::Test_providedBy::test_catches_only_AttributeError_on_providedBy src/zope/interface/tests/test_declarations.py::Test_providedBy::test_optimizations src/zope/interface/tests/test_declarations.py::Test_providedBy::test_super_multi_level_multi_inheritance src/zope/interface/tests/test_declarations.py::Test_providedBy::test_super_when_base_doesnt_implement_interface src/zope/interface/tests/test_declarations.py::Test_providedBy::test_super_when_base_implements_interface src/zope/interface/tests/test_declarations.py::Test_providedBy::test_super_when_base_is_object src/zope/interface/tests/test_declarations.py::Test_providedBy::test_super_when_object_directly_provides src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_invalid_spec src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_invalid_spec_class_w_implements src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_invalid_spec_w_provides_diff_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_invalid_spec_w_provides_no_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_invalid_spec_w_provides_same_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_valid_spec src/zope/interface/tests/test_declarations.py::Test_providedBy::test_wo_providedBy_on_class_wo_implements src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorFallbackTests::test_accessed_via_class src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorFallbackTests::test_accessed_via_inst_w_provides src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorFallbackTests::test_accessed_via_inst_wo_provides src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorTests::test_accessed_via_class src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorTests::test_accessed_via_inst_w_provides src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorTests::test_accessed_via_inst_wo_provides src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorTests::test_optimizations
src/zope/interface/declarations.py CHANGES.rst
src/zope/interface/declarations.py CHANGES.rst