掌握Python的X篇_23_main的作用(python规范写代码中,__name__内置变量的使用)

2023-11-17

上篇我们介绍了模块和如何使用模块,本篇将会介绍与模块共同会出现的问题,那就是在python规范写代码中会使用到__name__这种特殊的变量。

大家可能已经见过,规范的python代码,入口代码应该类似

if __name__ == "__main__":
    print("first line")

此处是否有if __name__ == "__main__":,程序运行之后都会输出first line,为什么要这样写呢?就需要从原理去了解。

1. __name__是什么

__name__是一个特殊的“内置变量”,它的值会随着程序启动情况的不同而不同
python中使用这个变量,来区分模块和主文件。

  • 所谓模块:被import的文件
  • 所谓的主文件:被python直接执行的文件
    为什么python会使用__name__这个变量,这就需要从模块import的不方便来进行讨论

2. 模块import的不方便

如果(不规范地)写了一个模块,并且在这个模块中,包含了测试的代码,以上篇中使用到的mymodule.py中增加两行测试程序,得到如下程序内容:

def add(x,y):
    return x+y
def max(x,y):
    if x > y:
        return x
    else:
        return y

print(add(10,30))
print(add(30,40))   

单独运行时,输出为40 70这是正常的,但是如果我在另一个程序文件fistpy.py中,importmymodule.py,进行加法运算并显示,得到如下程序:

import mymodule

print("first.py",mymodule.add(30,30))

运行之后结果:

40
70
first.py 60

显然这与我们预期只关注add(30,30)是存在差异的,程序将测试程序段也打印了出来。

这是因为import的本质就是将相应的python文件,复制粘贴到程序中运行,自然就会出现上述的结果。为了解决这个问题,就发明了__name__。

3. __name__的用处

__name__的值会随着py文件的加载情况不同而变化 :

  • 如果py文件作为主文件运行,则值为__main__
  • 如果作为模块加载,则值为模块的名称(路径)
    还是以上述的程序为例:
    mymodule.py代码改为如下:
def add(x,y):
    return x+y
def max(x,y):
    if x > y:
        return x
    else:
        return y

print(__name__)

运行结果:代表其为主文件

__main__

fistpy.py代码改为如下:

import mymodule

运行结果:代表其为模块

mymodule

有什么好处呢?
可以用这种方法来区分是在做测试当前模块有效,还是当做一个模块来使用。
因此可以将mymodule.py改为如下:

def add(x,y):
    return x+y
def max(x,y):
    if x > y:
        return x
    else:
        return y
if __name__ == "__main__":
    print(add(20,40))

作为主程序运行输出为:60

作为模块在fistpy.py中被使用时,if __name__ == "__main__":不成立,就不会影响fistpy.py本身程序的运行结果。

甚至,还有提倡在模块中类似C++/C的如下写法:

def add(x,y):
    return x+y
def max(x,y):
    if x > y:
        return x
    else:
        return y
    
def main():
    print(add(20,40))
if __name__ == "__main__":
    main()

再经过几篇介绍完python中的几个标准库之后,将会介绍更为有趣的内容,无所不能的python。

4. 学习视频地址:main的作用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

掌握Python的X篇_23_main的作用(python规范写代码中,__name__内置变量的使用) 的相关文章

  • 如何恢复tensorflow inceptions检查点文件(ckpt)?

    I have inception resnet v2 2016 08 30 ckpt文件是预先训练的初始模型 我想使用恢复这个模型 saver restore sess ckpt filename 但为此 我将需要编写训练该模型时使用的变量
  • 类的 IPython 表示

    我正在使用我创建的模块尝试 IPython 但它没有显示类对象的实际表示 相反 它显示类似的内容 TheClass module TheClass name I heavily在这个模块中使用元类 我有真正有意义的类表示 应该向用户显示 是
  • 让 VoiceChannel.members 和 Guild.members 返回完整列表的问题

    每当我尝试使用 VoiceChannel members 或 Guild members 时 它都不会提供适用成员的完整列表 我从文本命令的上下文中获取 VoiceChannel 和 Guild 如下所示 bot command name
  • 计算另一个字符串中多个字符串的出现次数

    在 Python 2 7 中 给定以下字符串 Spot是一只棕色的狗 斑点有棕色的头发 斑点的头发是棕色的 查找字符串中 Spot brown 和 hair 总数的最佳方法是什么 在示例中 它将返回 8 我正在寻找类似的东西string c
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • python multiprocessing 设置生成进程等待

    是否可以生成一些进程并将生成进程设置为等待生成的进程完成 下面是我用过的一个例子 import multiprocessing import time import sys def daemon p multiprocessing curr
  • 在 Django Admin 中调整字段大小

    在管理上添加或编辑条目时 Django 倾向于填充水平空间 但在某些情况下 当编辑 8 个字符宽的日期字段或 6 或 8 个字符的 CharField 时 这确实是一种空间浪费 字符宽 然后编辑框最多可容纳 15 或 20 个字符 我如何告
  • Python 3d 绘图设置固定色阶

    我正在尝试绘制两个 3d 数组 第一个数组的 z 值在范围内 0 15 0 15 第二个来自 0 001 0 001 当我绘图时 色标自动遵循数据范围 如何设置自定义比例 我不想看到 0 001 的浅色 而应该看到 0 15 的浅色 如何修
  • 为什么 web2py 在启动时崩溃?

    我正在尝试让 web2py 在 Ubuntu 机器上运行 所有文档似乎都表明要在 nix 系统上运行它 您需要下载源代码并执行以下操作 蟒蛇 web2py py 我抓住了source http www web2py com examples
  • PyQt 使用 ctrl+Enter 触发按钮

    我正在尝试在我的应用程序中触发 确定 按钮 我当前尝试的代码是这样的 self okPushButton setShortcut ctrl Enter 然而 它不起作用 这是有道理的 我尝试查找一些按键序列here http ftp ics
  • MongoEngine 查询具有以列表中指定的前缀开头的属性的对象的列表

    我需要在 Mongo 数据库中查询具有以列表中任何前缀开头的特定属性的元素 现在我有一段这样的代码 query mymodel terms term in query terms 并且这会匹配在列表 term 上有一个项目的对象 该列表中的
  • Tensorboard SyntaxError:语法无效

    当我尝试制作张量板时 出现语法错误 尽管开源代码我还是无法理解 我尝试搜索张量板的代码 但不清楚 即使我不擅长Python 我这样写路径C Users jh902 Documents logs因为我正在使用 Windows 10 但我不确定
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • 将 Matlab 的 datenum 格式转换为 Python

    我刚刚开始从 Matlab 迁移到 Python 2 7 在读取 mat 文件时遇到一些问题 时间信息以 Matlab 的日期数字格式存储 对于那些不熟悉它的人 日期序列号将日历日期表示为自固定基准日期以来已经过去的天数 在 MATLAB
  • 在 Google App Engine 中,如何避免创建具有相同属性的重复实体?

    我正在尝试添加一个事务 以避免创建具有相同属性的两个实体 在我的应用程序中 每次看到新的 Google 用户登录时 我都会创建一个新的播放器 当新的 Google 用户在几毫秒内进行多个 json 调用时 我当前的实现偶尔会创建重复的播放器
  • 每当使用 import cv2 时 OpenCV 都会出错

    我在终端上使用 pip3 install opencv contrib python 安装了 cv2 并且它工作了 但是每当我尝试导入 cv2 或运行导入了 cv2 的 vscode 文件时 在 python IDLE 上它都会说 Trac
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • 将索引与值交换的最快方法

    考虑pd Series s s pd Series list abcdefghij list ABCDEFGHIJ s A a B b C c D d E e F f G g H h I i J j dtype object 交换索引和值并
  • python 对浮点数进行不正确的舍入

    gt gt gt a 0 3135 gt gt gt print 3f a 0 314 gt gt gt a 0 3125 gt gt gt print 3f a 0 312 gt gt gt 我期待 0 313 而不是 0 312 有没有

随机推荐