加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 湛江站长网 (https://www.0759zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

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

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

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

  1. import 
  2.  a 
  3. def 
  4.  b_test(): 
  5.   
  6. print 
  7. ( 
  8. 'In test_b"' 
  9. ) 
  10.  a.a_test() 
  11. 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 
  10. ) 

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

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

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

总结

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

(编辑:PHP编程网 - 湛江站长网)

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