0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python模块有哪些注意事项

jf_78858299 来源:梯阅线条 作者:小梯子 2023-02-21 11:24 次阅读

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 testvar
Traceback (most recent call last):
 File "", line 1, in 
 File "e:\\documents\\F盘\\testvar.py", line 2, in 
func_a()
# 执行到第2行的 func_a() 报错,未定义
NameError: name 'func_a' is not defined
# 注释掉第2行的 func_a(),再次执行
>>> import testvar
run func_a
Traceback (most recent call last):
 File "", line 1, in 
 File "E:\\documents\\F盘\\testvar.py", line 8, in 
   func_a()
 File "E:\\documents\\F盘\\testvar.py", line 6, in func_a
func_b()
# 执行到第8行调用 func_a() ,第6行 调用 func_b(),报错未定义
NameError: name 'func_b' is not defined
# 注释掉第8行的 func_a(),再次执行
>>> import testvar
run func_a
run func_b
Traceback (most recent call last):
 File "", line 1, in 
 File "E:\\documents\\F盘\\testvar.py", line 14, in 
   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_b
print(s)
# 调用func_b()访问s时,报错s未定义
NameError: name 's' is not defined
# 注释掉第14行的 func_a(),在s=’梯阅线条’的下面语句调用func_a(),再次执行
>>> import testvar
run func_a
run 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,myecho
s = 'tyxt'
myecho()

E**:**\\documents\\F盘\\testfrom3.py

import testfrom1
testfrom1.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 s
from importlib import reload
reload(testreloadfrom1)

示例

# 打开cmd 执行下面示例
E:\\documents\\F盘>python testreloadfrom2.py
Traceback (most recent call last):
 File "testreloadfrom2.py", line 3, in 
reload(testreloadfrom1)
# from module import X,不可访问module
NameError: name 'testreloadfrom1' is not defined

E:\\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 "", line 1, in 
NameError: name 'testreloadfrom1' is not defined
# 先import testrelaodfrom1
>>> import testreloadfrom1
>>> reload(testreloadfrom1)
'testreloadfrom1' from 'E:\\\\documents\\\\F盘\\\\testreloadfrom1.py'>
# s仍然没有更新
>>> s
'梯阅线条'
# 需重新from M import X , s 才会更新
>>> from testreloadfrom1 import s
>>> s
'tyxt'
>>> exit()
# 通过import module 进行reload
E:\\documents\\F盘>python
>>> import testreloadfrom1
>>> testreloadfrom1.s
'tyxt'
# 修改testreloadfrom1.py的s=’梯阅线条’
>>> from importlib import reload
# 只需reload被导入模块即可
>>> reload(testreloadfrom1)
'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']
'testreloadfrom1' from 'E:\\\\documents\\\\F盘\\\\testreloadfrom1.py'>
>>> from importlib import reload
>>> reload(sys.modules['testreloadfrom1'])
'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 testmodb
N=9555

E**:**\\documents\\F盘\\testmoda.py

from testmoda import S
from testmoda import N

示例

# 打开cmd 执行下面示例
E:\\documents\\F盘>python
>>> import testmoda
Traceback (most recent call last):
 File "", line 1, in 
 File "E:\\documents\\F盘\\testmoda.py", line 2, in 
   import testmodb
 File "E:\\documents\\F盘\\testmodb.py", line 2, in 
from testmoda import N
# testmoda.py执行到import testmodb时,
# 从testmoda导入S成功,但是,从testmoda导入N失败,
# 因为此时testmoda还没执行完import testmodb,无法往下执行 N=9555
ImportError: cannot import name 'N' from 'testmoda' (E:\\documents\\F盘\\testmoda.py)
>>> exit()
# 修改testmodb.py
#from testmoda import S
#from testmoda import N
import testmoda
#############
>>> import testmoda
>>> testmoda.S
'梯阅线条'
>>> testmoda.N
9555
# 通过import M进行递归导入可以正常访问。
>>> testmoda.testmodb
'testmodb' from 'E:\\\\documents\\\\F盘\\\\testmodb.py'>
>>> testmoda.testmodb.testmoda.S
'梯阅线条'
>>> testmoda.testmodb.testmoda.N
9555
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4329

    浏览量

    62576
  • 代码
    +关注

    关注

    30

    文章

    4780

    浏览量

    68539
  • python
    +关注

    关注

    56

    文章

    4793

    浏览量

    84634
收藏 人收藏

    评论

    相关推荐

    如何选择车载GPS模块哪些注意事项

    如何选择车载GPS模块哪些注意事项
    发表于 05-18 06:37

    使用Python MyHDL哪些注意事项

    如何用Python写Verilog?使用Python MyHDL哪些注意事项
    发表于 06-23 14:10

    变频串联谐振耐压试验装置操作注意事项及接线注意事项哪些?

    变频串联谐振耐压试验装置操作注意事项及接线注意事项哪些?
    发表于 10-26 06:38

    CAN模块特性与设计上的注意事项简析

    文档文章目录目录Part 1. CAN 模块特性Part 2. 硬件设计上的注意事项Part 3. 软件设计上的注意事项Part 4. CAN波特率与采样点配置要求Part 5. 同步跳转位宽时间设置的
    发表于 01-06 08:04

    编写矩阵键盘模块哪些注意事项

    编写矩阵键盘模块哪些注意事项?怎样去设置串口数据格式的?
    发表于 02-23 07:56

    胆机使用的注意事项

    胆机使用的注意事项:胆机使用的注意事项 我是初哥, 现在对胆机感兴趣, 但听说胆机使用麻烦, 请问什么需要注意的?湖南吉首火车站 范增不必担心, 胆机的使用方法
    发表于 11-29 17:09 46次下载

    LCM使用注意事项

    LCM使用注意事项 1. 安装   LCD模块的安装是用PCB上的安
    发表于 04-16 21:38 1407次阅读

    电池使用哪些注意事项

    电池使用哪些注意事项?          1 仔细阅读电池说明书,使用深正规厂家的充电器;
    发表于 10-21 11:09 1263次阅读

    如何正确使用UPS?使用UPS哪些注意事项

    如何正确使用UPS?使用UPS哪些注意事项? 如何正确使用UPS 1)正常的开机顺序由于一般负载在启动
    发表于 03-18 17:57 2790次阅读

    蓝牙模块的基本常识与注意事项

    蓝牙模块的基本常识与注意事项兴趣的同学可以下载学习
    发表于 04-11 14:45 0次下载

    python字典类型的使用和注意事项

    字典类型在实际的python开发中,使用特别频繁,结合本人多年的工作经验,现将字典的使用以及字典使用注意事项总结如下:
    的头像 发表于 01-19 17:49 3527次阅读
    <b class='flag-5'>python</b>字典类型的使用和<b class='flag-5'>注意事项</b>

    SIWAREX称重模块安装接线注意事项

    SIWAREX称重模块安装接线注意事项说明。
    发表于 05-09 10:23 6次下载

    工控机使用哪些注意事项

    工控机使用哪些注意事项
    发表于 10-29 15:01 1239次阅读

    称重模块安装时常见问题及注意事项

    广州兰瑟电子给大家介绍称重模块安装时常见问题及注意事项
    发表于 03-17 14:51 994次阅读

    DC电源模块哪些注意事项和使用技巧?

    DC电源模块哪些注意事项和使用技巧?
    的头像 发表于 12-25 13:59 605次阅读
    DC电源<b class='flag-5'>模块</b><b class='flag-5'>有</b>哪些<b class='flag-5'>注意事项</b>和使用技巧?