文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python中如何使用语句导入模块或包

2023-06-02 00:26

关注

小编给大家分享一下Python中如何使用语句导入模块或包,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

  从一个模块导入全部

  from import * means意味着“我希望能访问中我有权限访问的全部名称”。例如以下代码something.py:

  # something.py

  public_variable = 42

  _private_variable = 141

  def public_function():

  print("I'm a public function! yay!")

  def _private_function():

  print("Ain't nobody accessing me from another module...usually")

  class PublicClass(object):

  pass

  class _WeirdClass(object):

  pass

  在Python解释器中,我们可以执行from something import *,然后看到如下的内容:

  >>> from something import *

  >>> public_variable

  42

  >>> _private_variable

  ...

  NameError: name '_private_variable' is not defined

  >>> public_function()

  "I'm a public function! yay!"

  >>> _private_function()

  ...

  NameError: name '_private_function' is not defined

  >>> c = PublicClass()

  >>> c

  >>> c = _WeirdClass()

  ...

  NameError: name '_WeirdClass' is not defined

  from something import *从something中导入了除了以_开头名称外的其他所有名称,按照规范,_开始的名称是私有的所以未被导入。

  嗯,不是特别糟!还有什么?

  上面没提到__all__是什么。all__是一个字符串列表,指定了当from import *被使用时,模块(或者如后文会提到的包)中的哪些符号会被导出。如果我们不定义__all(我们在上面的something.py就没定义),import *默认的导入方式是导入除了下划线(_)开头的所有名称。再说一次,编程惯例上下划线表示一个符号是私有的,不导入是合理的。让我们来看看在something.py中定义我们自己的__all__会发生什么。

  # something.py

  __all__ = ['_private_variable', 'PublicClass']

  # The rest is the same as before

  public_variable = 42

  _private_variable = 141

  def public_function():

  print("I'm a public function! yay!")

  def _private_function():

  print("Ain't nobody accessing me from another module...usually")

  class PublicClass(object):

  pass

  class _WeirdClass(object):

  pass郑州做人流手术 http://rl.zyfuke.com/

  现在,我们期望from something import *只会导入_private_variable和PublicClass:

  >>> from something import *

  >>> public_variable

  42

  >>> _private_variable

  ...

  NameError: name '_private_variable' is not defined

  >>> public_function()

  "I'm a public function! yay!"

  >>> _private_function()

  ...

  NameError: name '_private_function' is not defined

  >>> c = PublicClass()

  >>> c

  >>> c = _WeirdClass()

  ...

  NameError: name '_WeirdClass' is not defined

  包是怎样的呢?

  当从一个包中导入全部时,__all__的做法和模块基本一样,不过它处理的是包中的模块(而不是把模块中的名都导入)。所以当我们使用from import *.时__all__说明了所有需要被导入当前命名空间的模块。

  不同之处在于,如果你在一个包的__init__.py里面没有声明__all__,from import *语句不会导入任何东西(这个说法也不全对,正确的说法在此)

  但是,这有什么不好?

  写到这里,给大家推荐一个资源很全的python学习聚集地,点击进入,这里有资深程序员分享以前学习

  心得,学习笔记,还有一线企业的工作经验,且给大家精心整理一份python零基础到项目实战的资料,

  每天给大家讲解python最新的技术,前景,学习需要留言的小细节

  from import * 是不明确的。它没告诉我们我们正在导入什么或者我们把什么带入当前命名空间了。更好的做法是显式地导入我们需要的全部名称。这种方式下,读者(非常可能是未来的你自己)就不会困惑于你代码中使用的一个变量/方法/类/其他东西是哪儿来的,这也告诉了我们下一点:

  可读性很重要

  即使你需要导入很多东西,一个一个显式地导入也更清楚。使用PEP 328:

  from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,

  LEFT, DISABLED, NORMAL, RIDGE, END)

  你现在就能明确知道你的命名空间里有什么,使用ctrl+f能很快地告诉你它们是哪儿来的。

  同时,你还总是要承担模块/包作者更改list内容(加/减东西)的风险。也就是下面两者之一:

  作者从__all__里删除了一个字符串。如果你的代码使用了那个名字,你的代码就会报出NameError的错误,并且很难发现为什么。

  作者在__all__里加入了很多东西。你也许不需要这些增加的内容,所以你只是让这些你不关心的东西占满了你的命名空间。他们甚至在你不注意的时候会替代其他同名内容。

以上是“Python中如何使用语句导入模块或包”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯