Spaces:
Running
on
Zero
Running
on
Zero
| from __future__ import annotations | |
| import comfy.utils | |
| import folder_paths | |
| import logging | |
| from abc import ABC, abstractmethod | |
| from typing import Any | |
| import torch | |
| class ResourceKey(ABC): | |
| Type = Any | |
| def __init__(self): | |
| ... | |
| class TorchDictFolderFilename(ResourceKey): | |
| '''Key for requesting a torch file via file_name from a folder category.''' | |
| Type = dict[str, torch.Tensor] | |
| def __init__(self, folder_name: str, file_name: str): | |
| self.folder_name = folder_name | |
| self.file_name = file_name | |
| def __hash__(self): | |
| return hash((self.folder_name, self.file_name)) | |
| def __eq__(self, other: object) -> bool: | |
| if not isinstance(other, TorchDictFolderFilename): | |
| return False | |
| return self.folder_name == other.folder_name and self.file_name == other.file_name | |
| def __str__(self): | |
| return f"{self.folder_name} -> {self.file_name}" | |
| class Resources(ABC): | |
| def __init__(self): | |
| ... | |
| def get(self, key: ResourceKey, default: Any=...) -> Any: | |
| pass | |
| class ResourcesLocal(Resources): | |
| def __init__(self): | |
| super().__init__() | |
| self.local_resources: dict[ResourceKey, Any] = {} | |
| def get(self, key: ResourceKey, default: Any=...) -> Any: | |
| cached = self.local_resources.get(key, None) | |
| if cached is not None: | |
| logging.info(f"Using cached resource '{key}'") | |
| return cached | |
| logging.info(f"Loading resource '{key}'") | |
| to_return = None | |
| if isinstance(key, TorchDictFolderFilename): | |
| if default is ...: | |
| to_return = comfy.utils.load_torch_file(folder_paths.get_full_path_or_raise(key.folder_name, key.file_name), safe_load=True) | |
| else: | |
| full_path = folder_paths.get_full_path(key.folder_name, key.file_name) | |
| if full_path is not None: | |
| to_return = comfy.utils.load_torch_file(full_path, safe_load=True) | |
| if to_return is not None: | |
| self.local_resources[key] = to_return | |
| return to_return | |
| if default is not ...: | |
| return default | |
| raise Exception(f"Unsupported resource key type: {type(key)}") | |
| class _RESOURCES: | |
| ResourceKey = ResourceKey | |
| TorchDictFolderFilename = TorchDictFolderFilename | |
| Resources = Resources | |
| ResourcesLocal = ResourcesLocal | |