龙空技术网

python模块注意事项

梯阅线条 148

前言:

今天兄弟们对“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值。tyxt
1.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.N9555
2 END

本文首发微信公众号:梯阅线条

更多内容参考python知识分享或软件测试开发目录。

标签: #pythonreload