如何在Maya场景中用Python实现LRU缓存,存储对象名与类型并封装查询函数
在Maya中实现LRU缓存存储对象名称与类型的Python方案
实现思路
利用Python标准库的functools.lru_cache实现LRU缓存,缓存Maya场景中对象名称与类型的映射关系,再通过两个函数分别提取对象名称和类型数据。同时提供缓存刷新方法,应对场景变化后的缓存更新需求。
完整代码实现
import maya.cmds as cmds from functools import lru_cache @lru_cache(maxsize=None) # maxsize设为None表示无限制缓存,可根据需求调整为具体数值 def _get_scene_objects_cache(): """内部缓存函数,获取场景对象名称与类型的映射""" # 获取场景中所有对象的完整路径名称 all_objects = cmds.ls(long=True) # 构建名称到类型的字典 obj_type_map = {obj: cmds.objectType(obj) for obj in all_objects} return obj_type_map def get_all_object_names(): """返回场景中所有对象的完整名称列表""" return list(_get_scene_objects_cache().keys()) def get_all_object_types(): """返回与对象名称列表顺序对应的类型列表""" obj_map = _get_scene_objects_cache() return [obj_map[obj] for obj in obj_map.keys()] def get_object_type_mapping(): """返回对象名称到类型的映射字典(返回副本避免修改缓存)""" return _get_scene_objects_cache().copy() def refresh_scene_cache(): """手动清除缓存,下次调用时重新获取最新场景数据""" _get_scene_objects_cache.cache_clear()
使用说明
- 获取对象名称:调用
get_all_object_names()会返回场景中所有对象的完整路径列表,首次调用会触发缓存加载,后续调用直接读取缓存。 - 获取对象类型:
get_all_object_types()返回与名称列表一一对应的类型列表;get_object_type_mapping()返回完整的名称-类型映射字典,方便按名称查询类型。
- 更新缓存:当场景中对象增删、类型变更时,调用
refresh_scene_cache()清除旧缓存,后续函数调用会重新获取最新场景数据。
注意事项
- 使用
cmds.ls(long=True)确保获取对象的完整路径,避免重名对象导致的混淆; lru_cache默认基于函数参数缓存,这里函数无参数,所以缓存唯一对应当前场景状态;- 如果需要限制缓存大小,可修改
maxsize参数为具体数值(如maxsize=128),超出时自动淘汰最久未使用的缓存条目。
内容的提问来源于stack exchange,提问作者Kartikey Sinha
相关产品推荐
相关产品推荐

