当前位置: 首页 > news >正文

[PYTHON] import foo.bar 和 from foo import bar 有何不同

项目脚本使用python编写,为了减少单文件代码行数,便于逻辑功能拆分和管理,项目中大量使用了组件方式对文件进行拆分和导入,比如原client/entities/Space.py文件有两千多行,糅杂了各种逻辑,维护起来很不方便,现在将其抽取出来放到client/spacemembers/文件夹,并在Space.py中注入。

file client/spacemembers/__init__.py

def importall():  # import同目录下的多个文件return (__import__('CSpaceData', globals()),__import__('CSpaceBattle', globals()),__import__('CSpaceAvatar', globals()),...... ,)

client/entities/Space.py 中注入代码:

from client import spacemembers@Components(*spacemembers.importall())  # 这里由自定义的Components装饰器完成代码注入
class Space(object):pass

这种方式让代码组织更有条理,但在使用项目的reload脚本进行热更新的时候确报错了:

......client\spacemembers\__init__.py:11: RuntimeWarning: Parent module 'client.spacemembers' not found while handling absolute import __import__("CSpaceData", globals()),

然后发现将上面的import和注入改为下面即可解决:

import client.spacemembers@Components(*client.spacemembers.importall())
class Space(object):pass

那么 import foo.barfrom foo import bar这两种形式的import到底有何不同呢?你去stackoverflow和google搜索都找不到答案,大多说些都说些方便性和代码规范之类的。直到你看到python的源码:

/* Return the package that an import is being performed in.  If globals comesfrom the module foo.bar.bat (not itself a package), this returns thesys.modules entry for foo.bar.  If globals is from a package's __init__.py,the package's entry in sys.modules is returned, as a borrowed reference.The *name* of the returned package is returned in buf, with the length ofthe name in *p_buflen.If globals doesn't come from a package or a module in a package, or acorresponding entry is not found in sys.modules, Py_None is returned.
*/
static PyObject *
get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
{static PyObject *namestr = NULL;static PyObject *pathstr = NULL;static PyObject *pkgstr = NULL;PyObject *pkgname, *modname, *modpath, *modules, *parent;int orig_level = level;........

原来,正如错误信息提示的那样,项目的reload脚本在调用importall时将其parent记录为foo.bar,但使用from foo import bar进行import时globals()中并没有foo.bar

https://github.com/santazhang/Python-2.7.6/blob/a56836aa2cfabd873518358aa011857d6bb76283/Lib/ihooks.py#L415
https://github.com/santazhang/Python-2.7.6/blob/a56836aa2cfabd873518358aa011857d6bb76283/Python/import.c#L2310

http://www.jsqmd.com/news/333283/

相关文章:

  • 尖塔游记
  • 2026年2月四川工程机械出租行业云梯车、高空车、 云梯车租赁、 高空车租赁、 云梯车出租竞争格局深度分析报告 - 2026年企业推荐榜
  • 2026年首月浙江营销策划公司核心能力实测:全域整合与智能增长效果的综合绩效推荐 - 品牌推荐
  • 成都消防服务优选:四川中安锦胜——专业可靠的消防检测维保伙伴 - 深度智识库
  • 2026低压电力电缆优选:ZC-YJV源头厂家信赖之选,WDZN-YJY低烟无卤电力电缆,低压电力电缆企业推荐 - 品牌推荐师
  • 电商带货三步式快速开播工具:全能播Live Omni 解锁 AI 直播降本增效新路径
  • 2026年2月成都乳胶漆/涂料 /环保涂料/真石漆/仿石漆厂家竞争格局深度分析报告 - 2026年企业推荐榜
  • 闲置京东e卡别浪费!正规回收全流程拆解,新手也能轻松上手 - 可可收
  • 2026年电缆生产厂家名单:电缆生产厂家排名,知名的电缆生产厂家推荐精选 - 品牌2025
  • 2026年江西营销策划公司推荐:企业增长痛点深度评测,覆盖多场景服务排名 - 品牌推荐
  • 2026年全国API冻干粉哪家强?多家厂家解析 覆盖多领域原料供应 - 深度智识库
  • 【TVM教程】设备/目标交互
  • 2026最新停车设备/立体停车场/立体车库/停车场设备/停车库设备推荐:深耕云南,智能泊车解决方案首选 - 品牌推荐2026
  • 2026年矿山煤矿电力电缆生产厂家推荐:中低压、低压、中压、变频、聚乙烯、聚氯乙烯绝缘电缆全涵盖 - 品牌2025
  • 2026年2月汉堡王最新省钱攻略,美团下单超值美味分享 - Top品牌推荐
  • PCIe接口丨高速模拟采集丨高性能-高精度丨青翼军工级全国产化丨多通道信号处理板
  • 【Triton 教程】triton_language.abs
  • 2026年麦当劳最新省钱攻略,美团9.9元美味全解析 - Top品牌推荐
  • 空指针之痛:除了 if!=null,你还有更优雅的办法吗?
  • 名义雇主(EOR)助力德国企业加速全球合规用工,破解海外扩张难题 - 中青资讯
  • 全域赋能,品效双赢:三十六行网络科技池州分公司,定义本地生活数字运营新高度 - 野榜数据排行
  • 再互动拆解脉动的“开盖有奖”活动为何刷屏? - 品牌智鉴榜
  • <span class=“js_title_inner“>全栈“进化”公开课邀您参加|文心Moment大会走进大模型高效微调与极致推理全栈工程实践</span>
  • 2026年轨道交通电力电缆生产厂家推荐:中低压、低压、中压、变频、聚乙烯绝缘、聚氯乙烯绝缘电缆厂家汇总 - 品牌2025
  • 2026年消防电缆生产厂家推荐:耐火、防火、阻燃、阻燃B1级电缆生产厂家汇总 - 品牌2025
  • 学生数据统计不再头疼,学工一体化平台助力辅导员高效减负
  • 本土营销策划哪家强?2026年安徽营销策划公司推荐与排名,破解地域适配与成本痛点 - 品牌推荐
  • 2026最新机械式/智能停车设备推荐!国内优质停车设备权威榜单发布,资质服务双优破解停车难题云南/昆明停车设备推荐 - 品牌推荐2026
  • 2026年湖南营销策划公司排名:基于技术整合与ROI评测,解决策略脱节与执行痛点 - 品牌推荐
  • 深入解析现代AI编译器技术栈:从MLIR多级中间表示到TVM张量优化实现跨硬件平台的高性能深度学习模型部署实战