Python中import foo.bar as baz与from foo import bar as baz两种导入语句的差异疑问
Python中import foo.bar as baz与from foo import bar as baz两种导入语句的差异疑问
嘿,这个问题问得挺细致的!先直接给你结论:在绝大多数日常开发场景里,这两种导入方式本质上是等价的,你测试后看到baz和dir(baz)结果完全一致,完全是正常情况~
不过得拆分两种场景来细说,避免踩坑:
场景1:
bar是foo包下的子模块
比如你有个叫foo的文件夹(Python包),里面放了bar.py这个子模块。这时候两种写法的效果一模一样:都是把foo.bar这个子模块加载到内存,然后在当前代码的命名空间里给它起个baz的别名。你直接调用baz或者查看它的属性列表dir(baz),结果自然没区别。场景2:
bar是foo模块里的普通成员(比如函数、类、变量)
这种情况就不一样了!比如你有个单独的foo.py文件,里面定义了def bar(): print("hello")。这时候:- 写
import foo.bar as baz会直接报错,因为Python会把foo.bar当成一个子模块去寻找,但实际上bar只是foo里的一个函数,根本不是模块; - 而
from foo import bar as baz是完全合法的,能顺利把bar这个函数导入进来,并用baz作为它的别名,之后你直接调用baz()就能正常执行。
- 写
总结一下:如果是导入子模块,两种写法随便选;如果是导入模块里的具体成员,只能用from ... import ... as ...的写法哦。
备注:内容来源于stack exchange,提问作者keithIHS
相关产品推荐
相关产品推荐

