python中使用什么导入模块-Python中使用语句导入模块或包的机制研究

这篇文章讨论了Python的from import *和from import *,它们怎么执行以及为什么使用这种语法(也许)是一个坏主意。

从一个模块导入全部

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

# 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 *,然后看到如下的内容:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

>>>from somethingimport *

>>> 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__会发生什么。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

# 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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

>>>from somethingimport *

>>> 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解释器中,执行import this,再读一遍Python之禅(在你孩子每晚睡前也要读给他们)。

明确比含糊要好。

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

可读性很重要

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

?

1

2

from Tkinterimport (Tk, Frame, Button, Entry, Canvas, Text,

LEFT, DISABLED, NORMAL, RIDGE, END)

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

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

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

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

当然,有时候从模块或者包中导入全部内容是有用的。不过,这么做之前三思。从我的经验来看,这么做通常只是因为懒。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql触发器的要素_MySQL触发器

触发器是一类特殊的事务,可以监视某种数据操作(insert,update,delete),并触发相关操作(insert,update,delete)触发器创建之四要素:监视地点(table)监视事件(insert,update&#xff0…

您与此网站建立的连接不安全_dede网站密码忘记找回服务为先

dede网站密码忘记找回服务为先网站安全是现在一个非常重要的课题。基本上,互联网上的所有用户群都对自己的隐私信息和企业相关信息更感兴趣。因此,无论是搭建网站还是做一些平台,用户对网站服务器和网站空间安全都有很高的要求。对于网站服务…

python入门必备知识_python入门基本知识

1. 什么是语言语言是一个事物与另外一个事物沟通的介质。python则是人(程序员)与计算机沟通的介质。2. 什么是编程编程就是程序员将自己想要让计算机做的事情用编程语言翻译出来写到一系列的文件中。这一系列的文件称之为程序/软件。3. 为何要编程编程的目的就是让计算机按照程…

通达信手机版指标源码大全_通达信指标公式源码短炒买卖指标

做价值的传播者,一路同行,一起成长问题:怎样才能每天都收到这类文章!答案:只需点击上方《通达信指标公式软件》VAR1:((CLOSE-MA(CLOSE,6))/MA(CLOSE,6)*100(CLOSE-MA(CLOSE,24))/MA(CLOSE,24)*100(CLOSE-MA(CLOSE,32))…

c++ curl 超时_cc++写网络爬虫,curl+gumbo配合使用

是的,你没有听错。就是用c或者说c语言写爬虫。其实不难,虽然没有Python写起来那么简单。但是也不是那么复杂啦,毕竟好多大佬都写了那么多库,我们只要会用大佬写的库就行。网址:https://acm.sjtu.edu.cn/OnlineJudge/st…

S如何边缘控制_强夯法效果如何?来看看这个检测结果

强夯法指的是为提高软弱地基的承载力,用重锤自一定高度下落夯击土层使地基迅速固结的方法。强夯法适用于处理碎石土、砂土、低饱和度的粉土与黏性土、湿陷性黄土、杂填土和素填土等地基。对高饱和度的粉土与黏性土等地基,当采用在夯坑内回填块石、碎石或…

metinfo mysql_Metinfo 5.3.17 前台SQL注入漏洞

Metinfo 8月1日升级了版本,修复了一个影响小于等于5.3.17版本(几乎可以追溯到所有5.x版本)的SQL注入漏洞。这个SQL注入漏洞不受软WAF影响,可以直接获取数据,影响较广。### 0x01. 漏洞原理分析漏洞出现在 /include/global.func.php 文件的 jum…

冒泡和快速排序的时间复杂度_三分钟快速记住冒泡排序算法

冒泡排序名字由来:是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。冒泡排序原理:①、比较相邻的元素。如果第一个比第二个大&#xf…

js二维数组arr中表示读取第i行第j列的是:_c++ c语言 数组与字符串

c语法7 - 数组与字符串概述定义:把具有相同类型的若干变量按有序形式组织起来称为数组。C语言数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数…

linux安装weblogic_WebLogic的Azure虚拟机主要版本发布

作者:Reza Rahman我们很高兴地宣布,将发布在Azure Linux虚拟机上运行Oracle WebLogic Server(WLS)的解决方案的主要版本。该版本是与WebLogic团队共同开发的,是Microsoft和Oracle之间广泛合作伙伴关系的一部分。该合作…

mysql命令行导入url_Mysql 导入数据,推荐Source命令,太快了

VB.NET Winform的一些功能实现近段时间,开发的需要,需要写一个winform的程序.用VB.NET来写. 开发开始,需要实现一个窗体设为多文档界面 (MDI) 子窗体的容器.实现这个功能,开始找资料,得知设置一个属性:Form.I ...js+css实现模态层效果在做web前端的时候,有…

python wand安装_安装PythonMagick和pythonmagickwand 步骤

在centos6.0上测试安装,安装前准备工作:###############################################################################服务器如果没有安装Jpeg v6b、libPng、FreeType 的要在安装imagemagick之前先装好,否则imagemagick没法读取jpeg和p…

eprime经典程序案例_小程序经典案例!写字楼里的小店铺如何利用小程序增加人流量!...

大家好,我是柳州木子科技,当前短视频营销如火如荼,相比之下小程序不温不火,我还是那句话,是因为小程序没有把成功案例挖掘出来,通过小程序卖货赚钱的大有人在。前几篇分享了小程序玩赚的文章案例&#xff0…

python 服务注册_python注册Windows服务

注册windows服务程序框架安装pywin32pip install pywin32按照下述程序框架编写代码,业务逻辑写main函数里即可。SMWinserviceby Davide MastromatteoBase class to create winservice in Python-----------------------------------------Instructions:1. Just crea…

怎么看电脑配置高不高_电脑店学徒写的电脑配置单处处都是“亮点”,能“气死”师傅...

无论选择哪种类型的电脑都要把重点放在电脑硬件配置上面,电脑的性能完全依靠硬件配置的组合情况,电脑的价格高低标准依据同样是看电脑硬件配置组合情况,对于组装电脑来说,那硬件组合情况就格外重要了,因为组装电脑的硬…

hao123电脑版主页_百度浏览器停更没关系,hao123才令人唏嘘!

月初,百度浏览器官网发布公告,“由于部门业务调整,官方将于2019年4月30日对产品部分功能停止服务。相关的产品包括桌面百度、百度工具栏、百度地址栏、百度极速浏览器、hao123浏览器,产品将不再更新,基本功能本地仍可使…

mysql sha256函数_MySQL8.0新特性——默认使用caching_sha2_password作为身份验证插件

mysql5.8开始将caching_sha2_password作为默认的身份验证插件该caching_sha2_password和 sha256_password认证插件提供比mysql_native_password插件更安全的密码加密 ,并 caching_sha2_password提供了比更好的性能sha256_password。由于这些优越的安全性和性能特性 …

笔记本电脑摄像头不能用_电脑没有摄像头怎么办

现在大多数家庭电脑都没有配备摄像头,或者大多数普通笔记本电脑的摄像头又非常模糊,如果突然要用摄像头的话又不能马上买。但是手机上的摄像头又那么清楚,有没有办法把手机上的摄像头装到电脑上面呢?今天我要推荐的一款软件是Droi…

mysql创建的数据库在哪里_求助,mysql创建数据库找不到文件在哪问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼# For advice on how to change settings please see# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html# *** DO NOT EDIT THIS FILE. Its a template which will be copied to the# *** default loca…

excel取消隐藏_猴哥讲述:对excel工作表进行隐藏和取消隐藏的操作行为

有的时候因为工作需要,我们会在一个工作簿中创建插入多个excel工作表,如果工作表越来越多,我们在选择操作工作表的时候很不方便,我们这时候就可以对excel工作表进行隐藏,excel工作表隐藏和取消隐藏的操作方法如下&…