加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 建站 > 正文

关于Python导入模块,你可能没学透

发布时间:2019-10-26 16:54:09 所属栏目:建站 来源:马哥Linux
导读:副标题#e# 作为一名新手Python程序员,你首先需要学习的内容之一就是如何导入模块或包。但是我注意到,那些许多年来不时使用Python的人并不是都知道Python的导入机制其实非常灵活。在本文中,我们将探讨以下话题: 常规导入(regular imports) 使用from语句

然后在同个文件夹中创建另一个模块,将其命名为 b.py。

  1. import 
  2.  a 
  3. def 
  4.  b_test(): 
  5.   
  6. print 
  7. 'In test_b"' 
  8.  a.a_test() 
  9. b_test() 

如果你运行任意一个模块,都会引发 AttributeError。这是因为这两个模块都在试图导入对方。简单来说,模块 a想要导入模块 b,但是因为模块 b也在试图导入模块 a(这时正在执行),模块 a将无法完成模块 b的导入。我看过一些解决这个问题的破解方法(hack),但是一般来说,你应该做的是重构代码,避免发生这种情况。

覆盖导入

当你创建的模块与标准库中的模块同名时,如果你导入这个模块,就会出现覆盖导入。举个例子,创建一个名叫 math.py的文件,在其中写入如下代码:

  1. import 
  2.  math 
  3. def 
  4.  square_root(number): 
  5.   
  6. return 
  7.  math.sqrt(number) 
  8. square_root( 
  9. 72 

现在打开终端,试着运行这个文件,你会得到以下回溯信息(traceback):

  1. Traceback 
  2.  (most recent call  
  3. last 
  4. ): 
  5.   
  6. File 
  7.   
  8. "math.py" 
  9. , line  
  10. ,  
  11. in 
  12.   
  13. <module> 
  14.   
  15. import 
  16.  math 
  17.   
  18. File 
  19.   
  20. "/Users/michael/Desktop/math.py" 
  21. , line  
  22. ,  
  23. in 
  24.   
  25. <module> 
  26.  square_root( 
  27. 72 
  28.   
  29. File 
  30.   
  31. "/Users/michael/Desktop/math.py" 
  32. , line  
  33. ,  
  34. in 
  35.  square_root 
  36.   
  37. return 
  38.  math.sqrt(number) 
  39. AttributeError 
  40. :  
  41. module 
  42.   
  43. 'math' 
  44.  has  
  45. no 
  46.  attribute  
  47. 'sqrt' 

这到底是怎么回事?其实,你运行这个文件的时候,Python解释器首先在当前运行脚本所处的的文件夹中查找名叫 math的模块。在这个例子中,解释器找到了我们正在执行的模块,试图导入它。但是我们的模块中并没有叫 sqrt的函数或属性,所以就抛出了 AttributeError。

总结

在本文中,我们讲了很多有关导入的内容,但是还有部分内容没有涉及。PEP 302中介绍了导入钩子(import hooks),支持实现一些非常酷的功能,比如说直接从github导入。Python标准库中还有一个importlib模块,值得查看学习。当然,你还可以多看看别人写的代码,不断挖掘更多好用的妙招。

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读