关于import语句
#有一个困惑,可能题目比较长,谢谢各位耐心看看。import b
def x():
print('x')
b.y()
# b.py
import a
def y():
print('y')
a.x()
上述代码直接运行b是错误的,运行a也是错误的。为了知道错误的原因在哪里,我对他进行了一个小改进:
import a
print('importa语句成功')
def y():
print('y')
a.x()
import b
print('importb语句成功')
def x():
print('x')
b.y()
我就想看看import语句有没有成功,然后给我显示的是:
Traceback (most recent call last):
File "C:/Users/Liliya/Desktop/b.py", line 14, in <module>
import a
File "C:/Users/Liliya/Desktop\a.py", line 15, in <module>
import b
File "C:/Users/Liliya/Desktop\b.py", line 20, in <module>
a.x()
AttributeError: module 'a' has no attribute 'x'
那么说明我b程序中import a语句是没有问题正常运行的,才会到下一句打印出来print('import a 成功')那么import语句是不是只要我在搜索路径下找的到这个文件就能够正常运行呢?也就是在执行import 模块名这个语句的时候只是去搜索有没有这个文件,有的话正常运行,没有的话抛出异常,这条语句执行的过程中并不会去执行模块中的代码。
但是如果import语句成功是这样的话,我有一个困惑了,就是我们模块测试函数为啥会运行。
'''方法一:import temperatureconversion
方法二:from temperatureconversion import ctf,ftc'''
import temperatureconversion as t
print('成功导入')
print('32摄氏度 = %.2f 华氏度'% t.ctf(32))
print('99华氏度 = %.2f 摄氏度度'% t.ftc(99))
def ctf(temperature):
return temperature*1.8+32
def ftc(temperature):
return (temperature-32)/1.8
def test():#测试程序,用于检查函数模块功能
print('测试,0摄氏度=%.2f'%ctf(0))
print('测试,0华氏度=%.2f'%ftc(0))
#if __name__=='__main__':
print('执行测试文件了')
test()
我去添加了测试条件,来看什么时候被运行的,然后结果是:
执行测试文件了
测试,0摄氏度=32.00
测试,0华氏度=-17.78
成功导入
32摄氏度 = 89.60 华氏度
99华氏度 = 37.22 摄氏度度
这说明先运行了测试函数然后调用了函数,我不太明白了,这个测试函数是在什么时候运行的,应该不是import语句运行的把,因为如果是import语句运行的就跟前面的例子矛盾了,那这个是什么时候运行的呢?形象点说:是不是只要搜索路径下存在该模块(文件)这条语句就会被成功执行,import语句的过程中不会说运行文件的程序把?不然第一个例子就是有问题的。那么像上例的测试函数的时候事什么时候执行了呢? 本帖最后由 _2_ 于 2020-5-7 10:28 编辑
模块的引用应该是递进关系,而不是互相之间都有关系
你在 a.py 引入 b.py,又在 b.py 里引入 a.py,先抛开能不能正确运行,你的逻辑就有问题
在模块 被 import 之后,所以的代码都会运行一遍,如果不加 __name__ == "__main__",就会把测试函数也打印一遍,小甲鱼有讲,再好好回去听听 import 的时候会加载你定义的函数并执行你定义之外的模块代码。
理解没错的话你就一个问题:模块命名空间是怎么回事儿不明白。你可以打印出来看看效果print(__name__).命名空间就是你文件的名字,可以有多个命名空间,但是执行者只有一个,所以出现了__name__ == "__main__"语法,当你执行a.py那么a.py就是执行者,当你执行b.py那么b.py就是执行者。
之所以报错是因为你代码逻辑上导致程序锁死了。
import 的时候会执行你的模块代码【注意:模块内有任何执行类型的代码报错的话就会导致导入失败】,如果你模块里边都是定义函数的话就绝对不会有问题。但是如果有直接执行的代码的话,不注意命名空间的话就会锁死,导致程序崩溃。 773254968 发表于 2020-5-6 15:52
import 的时候会加载你定义的函数并执行你定义之外的模块代码。
理解没错的话你就一个问题:模块命名空间 ...
正解{:10_257:}
页:
[1]