Python相对导入场景下如何动态获取模块成员(以schemas模块的users为例)
解决方案
有两种简便的方式可以实现你想要的动态访问需求,同时保留相对导入的模块独立性:
方法一:使用内置的getattr()函数
Python模块对象支持通过getattr()函数动态获取属性,这是最直接的方案,不需要修改现有模块结构,直接替换写法即可:
from .. import schemas, services ... xy = RouteConfig( ... schemas=getattr(schemas, 'users') # 通过字符串'users'动态获取目标对象 ... )
如果担心路由名称可能不存在导致报错,可以添加默认值做兜底:
getattr(schemas, 'users', None) # 当'users'不存在时返回None,避免抛出AttributeError
方法二:在schemas模块中维护映射字典
如果你觉得getattr()不够直观,或者需要更集中地管理可访问的schema,可以在schemas/__init__.py里定义一个专门的字典,把需要暴露的schema统一关联起来:
# schemas/__init__.py from .users import users from .orders import orders # 假设还有其他需要管理的schema # 定义映射字典,将名称与对应的schema对象绑定 SCHEMA_MAP = { 'users': users, 'orders': orders }
之后在路由配置里直接通过这个字典访问:
from .. import schemas, services ... xy = RouteConfig( ... schemas=schemas.SCHEMA_MAP['users'] ... )
为什么schemas['users']无法运行?
模块对象本身不是字典类型,它不支持下标([])访问属性,只能通过.语法或者getattr()函数来获取属性,所以直接用下标会抛出TypeError。上面两种方法都完美解决了这个问题,同时保持了模块的相对导入独立性,不需要编写完整的模块路径。
内容的提问来源于stack exchange,提问作者K. Anye
相关产品推荐
相关产品推荐

