Repository: Project-MONAI/MONAI

Issue:
`_desc_` keyword in bundle for config readability
**Is your feature request related to a problem? Please describe.**
Although the bundle config can be yaml files which support inline commenting (starting a line with `#`), the json config couldn't include any comments or descriptions.
for example https://github.com/Project-MONAI/tutorials/blob/main/modules/bundle/spleen_segmentation/configs/inference.json is not very straightforward to understand.

This is a feature request for keyword `_desc_`, in addition to the existing ones https://github.com/Project-MONAI/MONAI/blob/1941283b1862e3f578ccfeb2bdfa864171125029/monai/bundle/config_item.py#L206

so that the users can provide some free text comments without breaking the config components.
new typing errors from flake8
**Describe the bug**
new typing errors from flake8 for example
https://github.com/Project-MONAI/MONAI/runs/7957404786?check_suite_focus=true

```
/home/runner/work/MONAI/MONAI/monai/fl/utils/filters.py:17:1: Filter is an abstract base class, but it has no abstract methods. Remember to use @abstractmethod, @abstractclassmethod and/or @abstractproperty decorators.
1     Filter is an abstract base class, but it has no abstract methods. Remember to use @abstractmethod, @abstractclassmethod and/or @abstractproperty decorators.
1
Check failed!
Please run auto style fixes: ./runtests.sh --autofix
```


Discussion:

Resolving patch:
diff --git a/monai/apps/reconstruction/networks/nets/utils.py b/monai/apps/reconstruction/networks/nets/utils.py
--- a/monai/apps/reconstruction/networks/nets/utils.py
+++ b/monai/apps/reconstruction/networks/nets/utils.py
@@ -182,6 +182,7 @@ def divisible_pad_t(
 
     Example:
         .. code-block:: python
+
             import torch
 
             # 2D data
@@ -195,6 +196,7 @@ def divisible_pad_t(
             x_pad,padding_sizes = divisible_pad_t(x, k=16)
             # the following line should print (3, 2, 64, 80, 80)
             print(x_pad.shape)
+
     """
     if len(x.shape) == 4:  # this is 2D
         b, c, h, w = x.shape
diff --git a/monai/bundle/config_item.py b/monai/bundle/config_item.py
--- a/monai/bundle/config_item.py
+++ b/monai/bundle/config_item.py
@@ -176,6 +176,7 @@ class ConfigComponent(ConfigItem, Instantiable):
           component doesn't explicitly depend on the other `ConfigItems` via its arguments,
           but requires the dependencies to be instantiated/evaluated beforehand.
         - ``"_disabled_"`` (optional): a flag to indicate whether to skip the instantiation.
+        - ``"_desc_"`` (optional): free text descriptions of the component for code readability.
 
     Other fields in the config content are input arguments to the python module.
 
@@ -203,7 +204,7 @@ class ConfigComponent(ConfigItem, Instantiable):
 
     """
 
-    non_arg_keys = {"_target_", "_disabled_", "_requires_"}
+    non_arg_keys = {"_target_", "_disabled_", "_requires_", "_desc_"}
 
     def __init__(
         self,
diff --git a/monai/fl/utils/filters.py b/monai/fl/utils/filters.py
--- a/monai/fl/utils/filters.py
+++ b/monai/fl/utils/filters.py
@@ -19,6 +19,7 @@ class Filter(abc.ABC):
     Used to apply filter to content of ExchangeObject.
     """
 
+    @abc.abstractmethod
     def __call__(self, data: ExchangeObject, extra=None) -> ExchangeObject:
         """
         Run the filtering.


Test patch:
diff --git a/tests/test_config_item.py b/tests/test_config_item.py
--- a/tests/test_config_item.py
+++ b/tests/test_config_item.py
@@ -26,7 +26,7 @@
 
 TEST_CASE_1 = [{"lr": 0.001}, 0.0001]
 
-TEST_CASE_2 = [{"_target_": "LoadImaged", "keys": ["image"]}, LoadImaged]
+TEST_CASE_2 = [{"_target_": "LoadImaged", "keys": ["image"], "_desc_": "an image reader for 'image'"}, LoadImaged]
 # test full module path
 TEST_CASE_3 = [{"_target_": "monai.transforms.LoadImaged", "keys": ["image"]}, LoadImaged]
 # test `_disabled_`