prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Use cleaner solution for non-truncating division in python 2
  Prefer `from __future__ import division` to `1.*x/y`
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `great_expectations/core/usage_statistics/anonymizers/anonymizer.py`
  Content:
  ```
  1 import logging
  2 from hashlib import md5
  3 from typing import Optional
  4 
  5 from great_expectations.util import load_class
  6 
  7 logger = logging.getLogger(__name__)
  8 
  9 
  10 class Anonymizer:
  11     """Anonymize string names in an optionally-consistent way."""
  12 
  13     def __init__(self, salt=None):
  14         if salt is not None and not isinstance(salt, str):
  15             logger.error("invalid salt: must provide a string. Setting a random salt.")
  16             salt = None
  17         if salt is None:
  18             import secrets
  19 
  20             self._salt = secrets.token_hex(8)
  21         else:
  22             self._salt = salt
  23 
  24     @property
  25     def salt(self):
  26         return self._salt
  27 
  28     def anonymize(self, string_):
  29         if string_ is None:
  30             return None
  31 
  32         if not isinstance(string_, str):
  33             raise TypeError(
  34                 f"""The type of the "string_" argument must be a string (Python "str").  The type given is
  35 "{str(type(string_))}", which is illegal.
  36             """
  37             )
  38         salted = self._salt + string_
  39         return md5(salted.encode("utf-8")).hexdigest()
  40 
  41     def anonymize_object_info(
  42         self,
  43         anonymized_info_dict,
  44         ge_classes,
  45         object_=None,
  46         object_class=None,
  47         object_config=None,
  48         runtime_environment=None,
  49     ) -> dict:
  50         assert (
  51             object_ or object_class or object_config
  52         ), "Must pass either object_ or object_class or object_config."
  53 
  54         if runtime_environment is None:
  55             runtime_environment = {}
  56 
  57         object_class_name: Optional[str] = None
  58         try:
  59             if object_class is None and object_ is not None:
  60                 object_class = object_.__class__
  61             elif object_class is None and object_config is not None:
  62                 object_class_name = object_config.get("class_name")
  63                 object_module_name = object_config.get(
  64                     "module_name"
  65                 ) or runtime_environment.get("module_name")
  66                 object_class = load_class(object_class_name, object_module_name)
  67             object_class_name = object_class.__name__
  68 
  69             for ge_class in ge_classes:
  70                 if issubclass(object_class, ge_class):
  71                     anonymized_info_dict["parent_class"] = ge_class.__name__
  72                     if not object_class == ge_class:
  73                         anonymized_info_dict["anonymized_class"] = self.anonymize(
  74                             object_class_name
  75                         )
  76                     break
  77 
  78             if not anonymized_info_dict.get("parent_class"):
  79                 anonymized_info_dict["parent_class"] = "__not_recognized__"
  80                 anonymized_info_dict["anonymized_class"] = self.anonymize(
  81                     object_class_name
  82                 )
  83         except AttributeError:
  84             anonymized_info_dict["parent_class"] = "__not_recognized__"
  85             anonymized_info_dict["anonymized_class"] = self.anonymize(object_class_name)
  86 
  87         return anonymized_info_dict
  88 
  89     @staticmethod
  90     def _is_parent_class_recognized(
  91         classes_to_check,
  92         object_=None,
  93         object_class=None,
  94         object_config=None,
  95     ) -> Optional[str]:
  96         """
  97         Check if the parent class is a subclass of any core GE class.
  98         This private method is intended to be used by anonymizers in a public `is_parent_class_recognized()` method. These anonymizers define and provide the core GE classes_to_check.
  99         Returns:
  100             The name of the parent class found, or None if no parent class was found
  101         """
  102         assert (
  103             object_ or object_class or object_config
  104         ), "Must pass either object_ or object_class or object_config."
  105         try:
  106             if object_class is None and object_ is not None:
  107                 object_class = object_.__class__
  108             elif object_class is None and object_config is not None:
  109                 object_class_name = object_config.get("class_name")
  110                 object_module_name = object_config.get("module_name")
  111                 object_class = load_class(object_class_name, object_module_name)
  112 
  113             for class_to_check in classes_to_check:
  114                 if issubclass(object_class, class_to_check):
  115                     return class_to_check.__name__
  116 
  117             return None
  118 
  119         except AttributeError:
  120             return None
  121
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/great_expectations/core/usage_statistics/anonymizers/anonymizer.py b/great_expectations/core/usage_statistics/anonymizers/anonymizer.py
  --- a/great_expectations/core/usage_statistics/anonymizers/anonymizer.py
  +++ b/great_expectations/core/usage_statistics/anonymizers/anonymizer.py
  @@ -35,6 +35,7 @@
   "{str(type(string_))}", which is illegal.
               """
               )
  +
           salted = self._salt + string_
           return md5(salted.encode("utf-8")).hexdigest()
  
verification_info: {"golden_diff": "diff --git a/great_expectations/core/usage_statistics/anonymizers/anonymizer.py b/great_expectations/core/usage_statistics/anonymizers/anonymizer.py\n--- a/great_expectations/core/usage_statistics/anonymizers/anonymizer.py\n+++ b/great_expectations/core/usage_statistics/anonymizers/anonymizer.py\n@@ -35,6 +35,7 @@\n \"{str(type(string_))}\", which is illegal.\n             \"\"\"\n             )\n+\n         salted = self._salt + string_\n         return md5(salted.encode(\"utf-8\")).hexdigest()\n", "issue": "Use cleaner solution for non-truncating division in python 2\nPrefer `from __future__ import division` to `1.*x/y`\n", "before_files": [{"content": "import logging\nfrom hashlib import md5\nfrom typing import Optional\n\nfrom great_expectations.util import load_class\n\nlogger = logging.getLogger(__name__)\n\n\nclass Anonymizer:\n    \"\"\"Anonymize string names in an optionally-consistent way.\"\"\"\n\n    def __init__(self, salt=None):\n        if salt is not None and not isinstance(salt, str):\n            logger.error(\"invalid salt: must provide a string. Setting a random salt.\")\n            salt = None\n        if salt is None:\n            import secrets\n\n            self._salt = secrets.token_hex(8)\n        else:\n            self._salt = salt\n\n    @property\n    def salt(self):\n        return self._salt\n\n    def anonymize(self, string_):\n        if string_ is None:\n            return None\n\n        if not isinstance(string_, str):\n            raise TypeError(\n                f\"\"\"The type of the \"string_\" argument must be a string (Python \"str\").  The type given is\n\"{str(type(string_))}\", which is illegal.\n            \"\"\"\n            )\n        salted = self._salt + string_\n        return md5(salted.encode(\"utf-8\")).hexdigest()\n\n    def anonymize_object_info(\n        self,\n        anonymized_info_dict,\n        ge_classes,\n        object_=None,\n        object_class=None,\n        object_config=None,\n        runtime_environment=None,\n    ) -> dict:\n        assert (\n            object_ or object_class or object_config\n        ), \"Must pass either object_ or object_class or object_config.\"\n\n        if runtime_environment is None:\n            runtime_environment = {}\n\n        object_class_name: Optional[str] = None\n        try:\n            if object_class is None and object_ is not None:\n                object_class = object_.__class__\n            elif object_class is None and object_config is not None:\n                object_class_name = object_config.get(\"class_name\")\n                object_module_name = object_config.get(\n                    \"module_name\"\n                ) or runtime_environment.get(\"module_name\")\n                object_class = load_class(object_class_name, object_module_name)\n            object_class_name = object_class.__name__\n\n            for ge_class in ge_classes:\n                if issubclass(object_class, ge_class):\n                    anonymized_info_dict[\"parent_class\"] = ge_class.__name__\n                    if not object_class == ge_class:\n                        anonymized_info_dict[\"anonymized_class\"] = self.anonymize(\n                            object_class_name\n                        )\n                    break\n\n            if not anonymized_info_dict.get(\"parent_class\"):\n                anonymized_info_dict[\"parent_class\"] = \"__not_recognized__\"\n                anonymized_info_dict[\"anonymized_class\"] = self.anonymize(\n                    object_class_name\n                )\n        except AttributeError:\n            anonymized_info_dict[\"parent_class\"] = \"__not_recognized__\"\n            anonymized_info_dict[\"anonymized_class\"] = self.anonymize(object_class_name)\n\n        return anonymized_info_dict\n\n    @staticmethod\n    def _is_parent_class_recognized(\n        classes_to_check,\n        object_=None,\n        object_class=None,\n        object_config=None,\n    ) -> Optional[str]:\n        \"\"\"\n        Check if the parent class is a subclass of any core GE class.\n        This private method is intended to be used by anonymizers in a public `is_parent_class_recognized()` method. These anonymizers define and provide the core GE classes_to_check.\n        Returns:\n            The name of the parent class found, or None if no parent class was found\n        \"\"\"\n        assert (\n            object_ or object_class or object_config\n        ), \"Must pass either object_ or object_class or object_config.\"\n        try:\n            if object_class is None and object_ is not None:\n                object_class = object_.__class__\n            elif object_class is None and object_config is not None:\n                object_class_name = object_config.get(\"class_name\")\n                object_module_name = object_config.get(\"module_name\")\n                object_class = load_class(object_class_name, object_module_name)\n\n            for class_to_check in classes_to_check:\n                if issubclass(object_class, class_to_check):\n                    return class_to_check.__name__\n\n            return None\n\n        except AttributeError:\n            return None\n", "path": "great_expectations/core/usage_statistics/anonymizers/anonymizer.py"}], "after_files": [{"content": "import logging\nfrom hashlib import md5\nfrom typing import Optional\n\nfrom great_expectations.util import load_class\n\nlogger = logging.getLogger(__name__)\n\n\nclass Anonymizer:\n    \"\"\"Anonymize string names in an optionally-consistent way.\"\"\"\n\n    def __init__(self, salt=None):\n        if salt is not None and not isinstance(salt, str):\n            logger.error(\"invalid salt: must provide a string. Setting a random salt.\")\n            salt = None\n        if salt is None:\n            import secrets\n\n            self._salt = secrets.token_hex(8)\n        else:\n            self._salt = salt\n\n    @property\n    def salt(self):\n        return self._salt\n\n    def anonymize(self, string_):\n        if string_ is None:\n            return None\n\n        if not isinstance(string_, str):\n            raise TypeError(\n                f\"\"\"The type of the \"string_\" argument must be a string (Python \"str\").  The type given is\n\"{str(type(string_))}\", which is illegal.\n            \"\"\"\n            )\n\n        salted = self._salt + string_\n        return md5(salted.encode(\"utf-8\")).hexdigest()\n\n    def anonymize_object_info(\n        self,\n        anonymized_info_dict,\n        ge_classes,\n        object_=None,\n        object_class=None,\n        object_config=None,\n        runtime_environment=None,\n    ) -> dict:\n        assert (\n            object_ or object_class or object_config\n        ), \"Must pass either object_ or object_class or object_config.\"\n\n        if runtime_environment is None:\n            runtime_environment = {}\n\n        object_class_name: Optional[str] = None\n        try:\n            if object_class is None and object_ is not None:\n                object_class = object_.__class__\n            elif object_class is None and object_config is not None:\n                object_class_name = object_config.get(\"class_name\")\n                object_module_name = object_config.get(\n                    \"module_name\"\n                ) or runtime_environment.get(\"module_name\")\n                object_class = load_class(object_class_name, object_module_name)\n            object_class_name = object_class.__name__\n\n            for ge_class in ge_classes:\n                if issubclass(object_class, ge_class):\n                    anonymized_info_dict[\"parent_class\"] = ge_class.__name__\n                    if not object_class == ge_class:\n                        anonymized_info_dict[\"anonymized_class\"] = self.anonymize(\n                            object_class_name\n                        )\n                    break\n\n            if not anonymized_info_dict.get(\"parent_class\"):\n                anonymized_info_dict[\"parent_class\"] = \"__not_recognized__\"\n                anonymized_info_dict[\"anonymized_class\"] = self.anonymize(\n                    object_class_name\n                )\n        except AttributeError:\n            anonymized_info_dict[\"parent_class\"] = \"__not_recognized__\"\n            anonymized_info_dict[\"anonymized_class\"] = self.anonymize(object_class_name)\n\n        return anonymized_info_dict\n\n    @staticmethod\n    def _is_parent_class_recognized(\n        classes_to_check,\n        object_=None,\n        object_class=None,\n        object_config=None,\n    ) -> Optional[str]:\n        \"\"\"\n        Check if the parent class is a subclass of any core GE class.\n        This private method is intended to be used by anonymizers in a public `is_parent_class_recognized()` method. These anonymizers define and provide the core GE classes_to_check.\n        Returns:\n            The name of the parent class found, or None if no parent class was found\n        \"\"\"\n        assert (\n            object_ or object_class or object_config\n        ), \"Must pass either object_ or object_class or object_config.\"\n        try:\n            if object_class is None and object_ is not None:\n                object_class = object_.__class__\n            elif object_class is None and object_config is not None:\n                object_class_name = object_config.get(\"class_name\")\n                object_module_name = object_config.get(\"module_name\")\n                object_class = load_class(object_class_name, object_module_name)\n\n            for class_to_check in classes_to_check:\n                if issubclass(object_class, class_to_check):\n                    return class_to_check.__name__\n\n            return None\n\n        except AttributeError:\n            return None\n", "path": "great_expectations/core/usage_statistics/anonymizers/anonymizer.py"}]}