Repository: Textualize/textual

Issue:
A `Widget`-derived widget with `inherit_bindings=False`, but no `BINDINGS`, appears to still inherit bindings
This is *very* much related to #1343, but I think merits an issue of its own to consider first. The reasons *why* this happens seem clear enough, but I feel the setup may cause confusion. With Textual as it is of 0.6.0 (with the bindings for movement keys being on `Widget`), consider this widget:

```python
class Odradek( Widget, inherit_bindings=False ):
    pass
````

vs this:

```python
class Odradek( Widget, inherit_bindings=False ):
    BINDINGS = []
````

In the former case the bindings of `Widget` are still inherited. In the latter they're not.

Discussion:

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d1641b1a3..42111addd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -28,6 +28,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
 - Fixed issue with auto width/height and relative children https://github.com/Textualize/textual/issues/1319
 - Fixed issue with offset applied to containers https://github.com/Textualize/textual/issues/1256
 - Fixed default CSS retrieval for widgets with no `DEFAULT_CSS` that inherited from widgets with `DEFAULT_CSS` https://github.com/Textualize/textual/issues/1335
+- Fixed merging of `BINDINGS` when binding inheritance is set to `None` https://github.com/Textualize/textual/issues/1351
 
 ## [0.5.0] - 2022-11-20
 
diff --git a/src/textual/dom.py b/src/textual/dom.py
index 0bd45fcce..49057b67d 100644
--- a/src/textual/dom.py
+++ b/src/textual/dom.py
@@ -229,7 +229,7 @@ class DOMNode(MessagePump):
             if issubclass(base, DOMNode):
                 if not base._inherit_bindings:
                     bindings.clear()
-                bindings.append(Bindings(base.BINDINGS))
+                bindings.append(Bindings(base.__dict__.get("BINDINGS", [])))
         keys = {}
         for bindings_ in bindings:
             keys.update(bindings_.keys)


Test patch:
diff --git a/tests/test_dom.py b/tests/test_dom.py
index 620984361..c1b5221c0 100644
--- a/tests/test_dom.py
+++ b/tests/test_dom.py
@@ -45,6 +45,39 @@ def test_validate():
         node.toggle_class("1")
 
 
+def test_inherited_bindings():
+    """Test if binding merging is done correctly when (not) inheriting bindings."""
+    class A(DOMNode):
+        BINDINGS = [("a", "a", "a")]
+
+    class B(A):
+        BINDINGS = [("b", "b", "b")]
+
+    class C(B, inherit_bindings=False):
+        BINDINGS = [("c", "c", "c")]
+
+    class D(C, inherit_bindings=False):
+        pass
+
+    class E(D):
+        BINDINGS = [("e", "e", "e")]
+
+    a = A()
+    assert list(a._bindings.keys.keys()) == ["a"]
+
+    b = B()
+    assert list(b._bindings.keys.keys()) == ["a", "b"]
+
+    c = C()
+    assert list(c._bindings.keys.keys()) == ["c"]
+
+    d = D()
+    assert not list(d._bindings.keys.keys())
+
+    e = E()
+    assert list(e._bindings.keys.keys()) == ["e"]
+
+
 def test_get_default_css():
     class A(DOMNode):
         pass