You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 13:12:36