前言:
今天兄弟们对“pythonreload”大概比较讲究,咱们都需要分析一些“pythonreload”的相关资讯。那么小编同时在网摘上汇集了一些有关“pythonreload””的相关知识,希望同学们能喜欢,大家一起来学习一下吧!1.1 变量要先赋值再引用
描述
python导入模块时从上到下执行不在函数内、不在类内的代码。
NO
类型
描述
1
顶层代码
不在函数内、不在类内的代码会立刻执行,无法引用后面位置赋值的变量名。所以被引用的变量要在前面位置进行赋值。比如,def定义函数要写在调用函数的前面。
2
非顶层代码
在函数内、在类内的代码,被调用的时候才会执行。
文件内容
E:\documents\F盘\testvar.py
func_a()def func_a(): print('run func_a') func_b() func_a()def func_b(): print('run func_a') print(s)func_a()s='梯阅线条'
示例
# 打开cmd 执行下面示例E:\documents\F盘>python>>> import testvarTraceback (most recent call last): File "<stdin>", line 1, in <module> File "e:\documents\F盘\testvar.py", line 2, in <module>func_a()# 执行到第2行的 func_a() 报错,未定义NameError: name 'func_a' is not defined# 注释掉第2行的 func_a(),再次执行>>> import testvarrun func_aTraceback (most recent call last): File "<stdin>", line 1, in <module> File "E:\documents\F盘\testvar.py", line 8, in <module> func_a() File "E:\documents\F盘\testvar.py", line 6, in func_afunc_b()# 执行到第8行调用 func_a() ,第6行 调用 func_b(),报错未定义NameError: name 'func_b' is not defined# 注释掉第8行的 func_a(),再次执行>>> import testvarrun func_arun func_bTraceback (most recent call last): File "<stdin>", line 1, in <module> File "E:\documents\F盘\testvar.py", line 14, in <module> func_a() File "E:\documents\F盘\testvar.py", line 6, in func_a func_b() File "E:\documents\F盘\testvar.py", line 12, in func_bprint(s)# 调用func_b()访问s时,报错s未定义NameError: name 's' is not defined# 注释掉第14行的 func_a(),在s=’梯阅线条’的下面语句调用func_a(),再次执行>>> import testvarrun func_arun func_b梯阅线条1.2 from复制变量而非别名
描述
from语句复制被导入的变量到导入模块,而非取变量别名。在导入模块修改变量值,不会更新被导入模块的变量值。
import module,通过module.X=Y修改变量值,会更新被导入模块的变量值。
文件内容
E:\documents\F盘\testfrom1.py
s='梯阅线条'def myecho(): print(s)
E:\documents\F盘\testfrom2.py
from testfrom1 import s,myechos = 'tyxt'myecho()
E:\documents\F盘\testfrom3.py
import testfrom1testfrom1.s = 'tyxt'testfrom1.myecho()
示例
# 打开cmd 执行下面示例E:\documents\F盘>python testfrom2.py# testfrom2.py修改s=’tyxt’,不影响testfrom1.py的s的值。梯阅线条E:\documents\F盘>python testfrom3.py# testfrom1.s=’tyxt’,会更新testfrom1.py的s值。tyxt1.3 reload不更新from客户端
描述
(1) from module import X,不会将module复制到当前模块,不可访问module,不可reload(module)。
(2) from module import X导入方式,需import module,再reload(module),最后from module import X,才会更新最新代码。【需import module,再reload(module),这个可以合并为reload(sys.modules[‘module’])实现,因为from module会缓存到sys.modules字典】
(3) import module导入方式,可以直接reload(module)更新最新代码。
文件内容
E:\documents\F盘\testreloadfrom1.py
s='梯阅线条'#s='tyxt'
E:\documents\F盘\testreloadfrom2.py
from testreloadfrom1 import sfrom importlib import reloadreload(testreloadfrom1)
示例
# 打开cmd 执行下面示例E:\documents\F盘>python testreloadfrom2.pyTraceback (most recent call last): File "testreloadfrom2.py", line 3, in <module>reload(testreloadfrom1)# from module import X,不可访问moduleNameError: name 'testreloadfrom1' is not definedE:\documents\F盘>python>>> from testreloadfrom1 import s>>> s'梯阅线条'# 修改testreloadfrom1.py的s=’tyxt’>>> from importlib import reload# from module 不可访问module>>> reload(testreloadfrom1)Traceback (most recent call last): File "<stdin>", line 1, in <module>NameError: name 'testreloadfrom1' is not defined# 先import testrelaodfrom1>>> import testreloadfrom1>>> reload(testreloadfrom1)<module 'testreloadfrom1' from 'E:\\documents\\F盘\\testreloadfrom1.py'># s仍然没有更新>>> s'梯阅线条'# 需重新from M import X , s 才会更新>>> from testreloadfrom1 import s>>> s'tyxt'>>> exit()# 通过import module 进行reloadE:\documents\F盘>python>>> import testreloadfrom1>>> testreloadfrom1.s'tyxt'# 修改testreloadfrom1.py的s=’梯阅线条’>>> from importlib import reload# 只需reload被导入模块即可>>> reload(testreloadfrom1)<module 'testreloadfrom1' from 'E:\\documents\\F盘\\testreloadfrom1.py'># s有更新>>> testreloadfrom1.s'梯阅线条'>>> exit()# 通过reload(sys.modules[‘M’])对from M import X进行重载E:\documents\F盘>python>>> from testreloadfrom1 import s>>> s'梯阅线条'# 修改testreloadfrom1.py的s=’tyxt’>>> import sys>>> sys.modules['testreloadfrom1']<module 'testreloadfrom1' from 'E:\\documents\\F盘\\testreloadfrom1.py'>>>> from importlib import reload>>> reload(sys.modules['testreloadfrom1'])<module 'testreloadfrom1' from 'E:\\documents\\F盘\\testreloadfrom1.py'>>>> s'梯阅线条'>>> from testreloadfrom1 import s>>> s'tyxt'1.4 python避免使用递归导入
描述
模块A导入模块B,模块B又导入模块A,这种情况称为递归导入。应该避免使用递归导入。如必须递归导入可以使用import M,而不使用from M import X。
文件内容
E:\documents\F盘\testmoda.py
S='梯阅线条'import testmodbN=9555
E:\documents\F盘\testmoda.py
from testmoda import Sfrom testmoda import N
示例
# 打开cmd 执行下面示例E:\documents\F盘>python>>> import testmodaTraceback (most recent call last): File "<stdin>", line 1, in <module> File "E:\documents\F盘\testmoda.py", line 2, in <module> import testmodb File "E:\documents\F盘\testmodb.py", line 2, in <module>from testmoda import N# testmoda.py执行到import testmodb时,# 从testmoda导入S成功,但是,从testmoda导入N失败,# 因为此时testmoda还没执行完import testmodb,无法往下执行 N=9555ImportError: cannot import name 'N' from 'testmoda' (E:\documents\F盘\testmoda.py)>>> exit()# 修改testmodb.py#from testmoda import S#from testmoda import Nimport testmoda#############>>> import testmoda>>> testmoda.S'梯阅线条'>>> testmoda.N9555# 通过import M进行递归导入可以正常访问。>>> testmoda.testmodb<module 'testmodb' from 'E:\\documents\\F盘\\testmodb.py'>>>> testmoda.testmodb.testmoda.S'梯阅线条'>>> testmoda.testmodb.testmoda.N95552 END
本文首发微信公众号:梯阅线条,
更多内容参考python知识分享或软件测试开发目录。
标签: #pythonreload