From 343284e370585c03094b31b86f8441fa43194b15 Mon Sep 17 00:00:00 2001 From: Mehrsary <38746704+Mehrsary@users.noreply.github.com> Date: Wed, 22 Oct 2025 16:06:36 +0000 Subject: [PATCH] feat: Add support for multiple instances of the same recognizer class using instance names in recognizer configuration --- .../recognizers_loader_utils.py | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/presidio-analyzer/presidio_analyzer/recognizer_registry/recognizers_loader_utils.py b/presidio-analyzer/presidio_analyzer/recognizer_registry/recognizers_loader_utils.py index 358ea9a622..bb6b9351c9 100644 --- a/presidio-analyzer/presidio_analyzer/recognizer_registry/recognizers_loader_utils.py +++ b/presidio-analyzer/presidio_analyzer/recognizer_registry/recognizers_loader_utils.py @@ -118,6 +118,22 @@ def get_recognizer_name(recognizer_conf: Union[Dict[str, Any], str]) -> str: return recognizer_conf return recognizer_conf["name"] + @staticmethod + def _get_instance_name( + recognizer_conf: Union[Dict[str, Any], str], default_name: str + ) -> str: + """Get the instance name of a recognizer in the configuration. + + If instance_name is provided, use it. Otherwise, use the default name. + This allows multiple instances of the same recognizer class with different configurations. + + :param recognizer_conf: The recognizer configuration. + :param default_name: The default name to use if instance_name is not provided. + """ + if isinstance(recognizer_conf, str): + return default_name + return recognizer_conf.get("instance_name", default_name) + @staticmethod def _is_language_supported_globally( recognizer: EntityRecognizer, @@ -225,15 +241,28 @@ def get( for k, v in RecognizerListLoader._get_recognizer_items( recognizer_conf=recognizer_conf ) - if k not in ["enabled", "type", "supported_languages", "name"] + if k not in ["enabled", "type", "supported_languages", "name", "instance_name"] } kwargs = {**copied_recognizer_conf, **language_conf} - recognizer_name = RecognizerListLoader.get_recognizer_name( + + # Get the class name for looking up the recognizer class + recognizer_class_name = RecognizerListLoader.get_recognizer_name( recognizer_conf=recognizer_conf ) recognizer_cls = RecognizerListLoader._get_existing_recognizer_cls( - recognizer_name=recognizer_name + recognizer_name=recognizer_class_name + ) + + # Use instance_name if provided, otherwise use the class name + instance_name = RecognizerListLoader._get_instance_name( + recognizer_conf=recognizer_conf, + default_name=recognizer_class_name ) + + # Add the instance name to kwargs if the recognizer supports it + if 'name' in recognizer_cls.__init__.__code__.co_varnames: + kwargs['name'] = instance_name + recognizer_instances.append(recognizer_cls(**kwargs)) for recognizer_conf in custom: