# Buggy code
def _dict_generator(input_dict, prefixes=None):
    prefixes = prefixes[:] if prefixes else []
    if isinstance(input_dict, dict):
        for key, value in input_dict.items():
            if isinstance(value, (dict, Namespace)):
                value = vars(value) if isinstance(value, Namespace) else value
                for d in _dict_generator(value, prefixes + [key]):
                    yield d
            else:
                yield prefixes + [key, value if value is not None else str(None)]
    else:
        yield prefixes + [input_dict if input_dict is None else str(input_dict)]


# Traceback (mlflow.exceptions.MlflowException)
Traceback (most recent call last):
File "/home/siavash/KroniKare/kwae2/kwae_ma/models/pl_train_segmentation_model.py", line 115, in <module>
main()
File "/home/siavash/anaconda3/envs/kwae-ma/lib/python3.7/site-packages/hydra/main.py", line 24, in decorated_main
strict=strict,
File "/home/siavash/anaconda3/envs/kwae-ma/lib/python3.7/site-packages/hydra/_internal/utils.py", line 174, in run_hydra
overrides=args.overrides,
File "/home/siavash/anaconda3/envs/kwae-ma/lib/python3.7/site-packages/hydra/_internal/hydra.py", line 86, in run
job_subdir_key=None,
File "/home/siavash/anaconda3/envs/kwae-ma/lib/python3.7/site-packages/hydra/plugins/common/utils.py", line 109, in run_job
ret.return_value = task_function(task_cfg)
File "/home/siavash/KroniKare/kwae2/kwae_ma/models/pl_train_segmentation_model.py", line 111, in main
trainer.fit(wound_seg_pl)
File "/home/siavash/anaconda3/envs/kwae-ma/lib/python3.7/site-packages/pytorch_lightning/trainer/trainer.py", line 765, in fit
self.single_gpu_train(model)
File "/home/siavash/anaconda3/envs/kwae-ma/lib/python3.7/site-packages/pytorch_lightning/trainer/distrib_parts.py", line 492, in single_gpu_train
self.run_pretrain_routine(model)
File "/home/siavash/anaconda3/envs/kwae-ma/lib/python3.7/site-packages/pytorch_lightning/trainer/trainer.py", line 843, in run_pretrain_routine
self.logger.log_hyperparams(ref_model.hparams)
File "/home/siavash/anaconda3/envs/kwae-ma/lib/python3.7/site-packages/pytorch_lightning/loggers/base.py", line 275, in log_hyperparams
[logger.log_hyperparams(params) for logger in self._logger_iterable]
File "/home/siavash/anaconda3/envs/kwae-ma/lib/python3.7/site-packages/pytorch_lightning/loggers/base.py", line 275, in <listcomp>
[logger.log_hyperparams(params) for logger in self._logger_iterable]
File "/home/siavash/anaconda3/envs/kwae-ma/lib/python3.7/site-packages/pytorch_lightning/utilities/distributed.py", line 10, in wrapped_fn
return fn(*args, **kwargs)
File "/home/siavash/anaconda3/envs/kwae-ma/lib/python3.7/site-packages/pytorch_lightning/loggers/mlflow.py", line 105, in log_hyperparams
self.experiment.log_param(self.run_id, k, v)
File "/home/siavash/anaconda3/envs/kwae-ma/lib/python3.7/site-packages/mlflow/tracking/client.py", line 206, in log_param
self._tracking_client.log_param(run_id, key, value)
File "/home/siavash/anaconda3/envs/kwae-ma/lib/python3.7/site-packages/mlflow/tracking/_tracking_service/client.py", line 177, in log_param
_validate_param_name(key)
File "/home/siavash/anaconda3/envs/kwae-ma/lib/python3.7/site-packages/mlflow/utils/validation.py", line 120, in _validate_param_name
INVALID_PARAMETER_VALUE)
mlflow.exceptions.MlflowException: Invalid parameter name: ''. Names may be treated as files in certain cases, and must not resolve to other names when treated as such. This name would resolve to '.'

# Fixed code
def _dict_generator(input_dict, prefixes=None):
    prefixes = prefixes[:] if prefixes else []
    if isinstance(input_dict, MutableMapping):
        for key, value in input_dict.items():
            if isinstance(value, (MutableMapping, Namespace)):
                value = vars(value) if isinstance(value, Namespace) else value
                for d in _dict_generator(value, prefixes + [key]):
                    yield d
            else:
                yield prefixes + [key, value if value is not None else str(None)]
    else:
        yield prefixes + [input_dict if input_dict is None else str(input_dict)]