def find()

in robogym/utils/env_utils.py [0:0]


    def find(cls, pattern, fun_name=None):
        if pattern.endswith("py") and os.path.exists(pattern):
            if fun_name is None:
                fun_name = "make_env"

            print(f"Loading environment from {pattern}::{fun_name}")
            module = run_path(pattern)
            make_env = module[fun_name]
            return make_env
        elif pattern.endswith((".jsonnet", ".libsonnet", ".json")) and os.path.exists(
            pattern
        ):

            def resolve_fun_name(data, fun_name):
                for elem in fun_name.split("."):
                    data = data[elem]
                return data

            print(f"Loading environment from {pattern}::{fun_name}")
            if pattern.endswith(".json"):
                with open(pattern, "r") as f:
                    data = json.load(f)
            else:
                data = json.loads(_jsonnet.evaluate_file(pattern))
            if fun_name is not None:
                resolved_data = resolve_fun_name(data, fun_name)
            else:
                # Auto-detect a working fun_name
                candidates = ["make_env", "machine_pools.evaluator.args.make_env"]
                resolved_data = None
                for candidate in candidates:
                    try:
                        resolved_data = resolve_fun_name(data, candidate)
                        break
                    except KeyError:
                        pass
                assert (
                    resolved_data is not None
                ), "could not auto-detect a function name; please provide it (e.g. via `::machine_pools.bch-b1.args.make_env`)"

            make_env = get_function(resolved_data)
            return make_env
        else:
            matching = [
                m for p in cls.ENV_PATTERNS for m in glob.glob(p, recursive=True)
            ]
            matching = [match for match in matching if match.find(pattern) > -1]
            matching = [
                match
                for match in matching
                if not os.path.basename(match).startswith("test_")
            ]
            assert len(matching) < 2, "Found multiple environments matching %s" % str(
                matching
            )
            if len(matching) == 1:
                matching = matching[0]
                if matching.endswith(".py") and fun_name is not None:
                    matching += "::" + fun_name
                return cls.find(matching)
            else:
                assert None