python包之间引用,python中怎么调用包
Python的from import *和from import *,它们的功能是将包引入使用,但是它们是如何执行的,为什么要使用这种语法?
从一模块导入全部功能
From import *表示“我想访问我有权访问的所有名称”。例如,下面的代码something.py:
#something.py
public_variable=42
_private_variable=141
defpublic_function():
print( I mappublicfunction!“耶!”)
def_private_function():
打印( Ain tnobodyaccessingmefmromanothermodule.通常’)
classPublicClass(object):
及格
class_WeirdClass(object):
在pass Python解释器中,我们可以从import *开始执行,然后看到以下内容:
fromsomethingimport*
公共变量
四十二个
_私有_变量
.
name error : name“_ private _ variable”未定义
公共函数()
我是公共函数!“耶!”
_私有函数()
.
name error : name“_ private _ function”未定义
c=PublicClass()
c
something . public class object= at= .=
c=_WeirdClass()
.
错误:未定义名称 _ Weird class ,from something import *导入了除_ from以外的所有名称。根据规范,以_开头的名称是私有的,因此它们不会被导入。
它没有提到__all__是什么。__all__是一个字符串列表,它指定当使用from import *时,模块(或后面将提到的包)中的哪些符号将被导出。如果我们没有定义__all__(我们在上面的something.py中没有定义),那么import *的默认导入方式是导入除下划线(_)开头以外的所有名称。同样,在编程约定中加下划线意味着符号是私有的,不导入它是合理的。让我们看看当我们在something.py中定义自己的__all__时会发生什么
#something.py
__all__=[_private_variable , PublicClass]
#以前的成绩
public_variable=42
_私人
_variable=141
defpublic_function():
print("I'mapublicfunction!yay!")
def_private_function():
print("Ain'tnobodyaccessingmefromanothermodule...usually")
classPublicClass(object):
pass
class_WeirdClass(object):
pass现在,我们期望from something import *只会导入_private_variable和PublicClass:
>>>fromsomethingimport*包是怎样的呢?>>>public_variable
42
>>>_private_variable
...
NameError:name'_private_variable'isnotdefined
>>>public_function()
"I'mapublicfunction!yay!"
>>>_private_function()
...
NameError:name'_private_function'isnotdefined
>>>c=PublicClass()
>>>c
<something.publicclassobject=""at=""...="">
>>>c=_WeirdClass()
...
NameError:name'_WeirdClass'isnotdefined
当从一个包中导入全部时,__all__的做法和模块基本一样,不过它处理的是包中的模块(而不是把模块中的名都导入)。所以当我们使用from import *.时__all__说明了所有需要被导入当前命名空间的模块。
不同之处在于,如果你在一个包的__init__.py里面没有声明__all__,from import *语句不会导入任何东西(这个说法也不全对,正确的说法在此)
但是,这有什么不好?
继续读之前,在你的Python解释器中,执行import this,再读一遍Python之禅(在你孩子每晚睡前也要读给他们)。
明确比含糊要好。
from import * 是不明确的。它没告诉我们我们正在导入什么或者我们把什么带入当前命名空间了。更好的做法是显式地导入我们需要的全部名称。这种方式下,读者(非常可能是未来的你自己)就不会困惑于你代码中使用的一个变量/方法/类/其他东西是哪儿来的,这也告诉了我们下一点:
可读性很重要
即使你需要导入很多东西,一个一个显式地导入也更清楚。使用PEP 328:
fromTkinterimport(Tk,Frame,Button,Entry,Canvas,Text,你现在就能明确知道你的命名空间里有什么,使用ctrl+f能很快地告诉你它们是哪儿来的。LEFT,DISABLED,NORMAL,RIDGE,END)
同时,你还总是要承担模块/包作者更改list内容(加/减东西)的风险。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。