鱼C论坛

 找回密码
 立即注册
查看: 874|回复: 3

关于import语句

[复制链接]
发表于 2020-5-6 14:06:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#有一个困惑,可能题目比较长,谢谢各位耐心看看。
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>[code]
    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'[/code]
那么说明我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语句的过程中不会说运行文件的程序把?不然第一个例子就是有问题的。那么像上例的测试函数的时候事什么时候执行了呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-6 14:57:14 From FishC Mobile | 显示全部楼层
本帖最后由 _2_ 于 2020-5-7 10:28 编辑

模块的引用应该是递进关系,而不是互相之间都有关系
你在 a.py 引入 b.py,又在 b.py 里引入 a.py,先抛开能不能正确运行,你的逻辑就有问题
在模块 被 import 之后,所以的代码都会运行一遍,如果不加 __name__ == "__main__",就会把测试函数也打印一遍,小甲鱼有讲,再好好回去听听
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-6 15:52:04 | 显示全部楼层
import 的时候会加载你定义的函数并执行你定义之外的模块代码。
理解没错的话你就一个问题:模块命名空间是怎么回事儿不明白。你可以打印出来看看效果print(__name__).命名空间就是你文件的名字,可以有多个命名空间,但是执行者只有一个,所以出现了__name__ == "__main__"语法,当你执行a.py那么a.py就是执行者,当你执行b.py那么b.py就是执行者。
之所以报错是因为你代码逻辑上导致程序锁死了。
import 的时候会执行你的模块代码【注意:模块内有任何执行类型的代码报错的话就会导致导入失败】,如果你模块里边都是定义函数的话就绝对不会有问题。但是如果有直接执行的代码的话,不注意命名空间的话就会锁死,导致程序崩溃。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-6 16:01:50 From FishC Mobile | 显示全部楼层
773254968 发表于 2020-5-6 15:52
import 的时候会加载你定义的函数并执行你定义之外的模块代码。
理解没错的话你就一个问题:模块命名空间 ...

正解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 05:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表