• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于python:Python-import-时要注意的几个问题

python 搞代码 3年前 (2022-02-20) 26次浏览 已收录 0个评论

咱们在Python中,总是应用import来导入另外一个模块(文件)中的内容,如果是从Java或C转过来的程序员,有几个常见的坑要留神一下:

  1. import也是执行语句,能够在代码任何部位执行。如果咱们把import写在代码两头,IDE很可能会有个正告,但只有逻辑正确,就不必理它:

    import a
    
    if __name__ == "__main__":
     import b
     b.methodx()

    相似以上代码,只有以后文件作为主模块运行的时候,才导入模块b,岂但缩小了节约,而且有可能防止循环援用。

  2. import执行的时候,如果是第一次导入,那么会把对应模块执行一遍,这个模块里所有的顶级代码都会执行,所以是个很耗时的操作,这点跟Java或者C只是获取类型定义齐全不同;所以那些被复用的模块,要尽量缩小在顶级代码块中实现逻辑
  3. 即便在同一个模块里,代码定义的程序也很重要,被援用的代码肯定要在援用的后面定义,比方:

    class A:
     x: int = 5
    
    
    class B:
     def __init__(self, y: A):
         self.y = y
    
    
    if __name__ == "__main__":
     a = A()
     b = B(a)
     print(b.y.x)
    

    下面这段代码里就不能把class A的定义放在class B前面,否则运行时会出错,提醒name 'A' is not defined;当然如果仅仅是annotation里援用的话,能够通过from __future__ import annotations来解决,这是另外一个问题了。

  4. import的namespace也很重要,命名空间不同,会被认为是不同的模块。而一个模块,用绝对路径或者相对路径引入,会被辨认为不同的命名空间,比方上面的package构造:

module_a的内容如下:

a = {"value": 15}
print(f'a={a} in module_a')

module_b会用绝对路径援用module_a

from lang.test_import.module_a import a


a['value'] = a['value'] + 1

print(f'a={a} in module_b')

module_c1和module_c2别离用相对路径和绝对路径引入module_a,再引入module_b,就会失去不同的后果:

from module_a import a
import module_b

print(f'a={a} in module_c1')
<code class="console">a={'value': 15} in module_a
a={'value': 15} in module_a
a={'value': 16} in module_b
a={'value': 15} in module_c1
from lang.test_import.module_a import a
import module_b

print(f'a={a} in module_c2')
<code class="console">a={'value': 15} in module_a
a={'value': 16} in module_b
a={'value': 16} in module_c2

能够看到在module_c1中,module_a被引入了两次,认作不同的模块,从而也引入了两个变量a,而c1模块,只抵赖本人引入的相对路径命名空间中的a,所以这里的a.value,并没有被模块b更改。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于python:Python-import-时要注意的几个问题

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址