Python中库导入from . import 和from .. import 的使用方法

本文详细解析了Python中包内的相对导入语法from.import和from..import的使用场景与限制,通过具体示例展示了如何在子包中正确使用这两种导入方式,并强调了它们在调试和调用时的注意事项。

                                      Python中库导入from . import 和from .. import 的使用方法

 

程序目录结构如下

 

from . import XX 和 from .. import XX 只能使用在子包中,例如上面的例子中,程序最外层是主程序app.py,程序有一个子包pack1,pack1下有a.py 和b.py两个文件,pack1下面有子包pack2,pack2下有c.py

#a.py
def f1():
    print("aaaaaaaaaaaaaa")
#--b.py
from .  import a
def zz():
    a.f1()
    
#--c.py
from .. import a
def cc():
    a.f1()
    

可以看到b.py和c,py 分别使用了import . 和import ..的用法

在app.py 中分表调用b和c的函数

# app.py
import pack1.b as b
import pack1.pack2.c as c

b.zz()
c.cc()

 注意的是: 只能在app.py 同级的位置调用使用了import .和 import ..的b和c,也就是在库pack1的外面调用。

如果想单独调试b和c ,此时是不允许在b和c文件中使用if __name__=="__main__"的方式进行调试的

那么在b.py 中是否允许使用使用 from .. import d   来调用的d文件呢

不允许,因为d.py  和app.py 主程序处于同一层级,超过了pack1包的范围

 

### 基本使用方式 - **`import`**:用于导入整个模块,使用模块中的功能时,需通过`模块名.功能名`的形式调用。例如导入`math`模块并使用其`sqrt`函数: ```python import math result = math.sqrt(16) print(result) ``` - **`from...import`**:用于从模块中导入特定的功能(函数、类、变量等),导入后可直接使用这些功能,无需通过模块名引用。例如从`math`模块导入`sqrt`函数: ```python from math import sqrt result = sqrt(16) print(result) ``` ### 使用场景对比 - **需要使用模块的多个功能**:若要使用模块中的多个功能,使用`import`可将整个模块导入,后续通过`模块名.方法/类/变量`调用,代码可读性高,能明确功能来源。例如使用`random`模块的多个函数: ```python import random print(random.randint(1, 10)) print(random.random()) ``` 若仅需使用模块中的少数功能,使用`from...import`更简洁,可直接使用导入的功能,无需添加模块名前缀。例如只使用`math`模块的`pi``sin`函数: ```python from math import pi, sin print(pi) print(sin(pi / 2)) ``` - **避免命名冲突**:使用`import`导入模块时,模块中的名称不会直接引入当前命名空间,而是通过模块名访问,可避免与当前命名空间中的其他名称冲突。例如自定义变量名可能与模块中的某个函数名相同,使用`import`可避免混淆: ```python import math pi = 3.14 print(pi) print(math.pi) ``` 使用`from...import`会将指定的名称直接引入当前命名空间,可能导致命名冲突。若不同模块中有相同名称的功能,使用`from...import`会使代码难以区分功能来源。例如: ```python from module1 import func from module2 import func # 会产生命名冲突 ``` - **引入带层级的模块**:当导入的模块存在层级关系时,使用`import`可方便地导入整个层级结构。例如导入`a.b.c`模块: ```python import a.b.c ``` 使用`from...import`也可导入层级模块中的特定功能: ```python from a.b.c import some_function ``` ### 性能与内存方面 - **`import`**:导入整个模块时,会将模块的所有内容加载到内存中,但在使用时才会执行模块中的代码。若模块较大,可能会占用较多内存,但不同程序导入同一模块时,会共用内存中的模块副本,节省内存。 - **`from...import`**:从模块中导入特定功能时,只会将指定的功能加载到内存中,可减少内存占用。但每次导入时都会在内存中创建并加载功能的副本,不同程序导入时不会共用副本,程序对导入功能的修改不会影响原模块,不同程序之间也不会互相影响[^3]。 ### 其他注意事项 简单的模块一般倾向于使用`import`,多数的`from`语句用于明确列举想要的变量,且限制在每个文件中只用一次`from *`形式。这样,任何无定义的变量名都可认为存在于`from *`所引用的模块内。当必须使用两个不同模块内定义的相同变量名变量时,必须使用`import`,这种情况下不能使用`from`[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值