【遇见Python】Define、Module & Package(Part II)

107 阅读2分钟

引言

上篇文章从一个在jser看来很正常,但是在python中却产生了的报错,聊到了如何解决该报错。本篇文章将继续深入下去,探究下报错的原因。

module概述

解释器

Python是一种解释型脚本语言。Python的解释器,是运行脚本的Python核心引擎。

直接在终端中运行python的时候,其实是在运行Python的解释器。它可以读取 & 执行输入的命令。

但这种方式,并不是好的编码实践——没有人想整天坐在终端旁边写代码的!!!

脚本

于是,我们有了脚本。简单说,就是.py文件。

但是,如果想写个,能在多个脚本中使用的函数,该怎么办?

模块

于是,诞生了模块。

模块,包含一个或多个define的.py脚本。

def(define)是我们在模块中定义的函数,可以通过import关键字在其他脚本中引用。

文件名,可以当做模块名。

例如:如果我们有foo.py,我们可以使用import foo导入它。

当模块,与主脚本在同一目录时,模块通常工作得最好。

当使用import关键字(例如import foo)时,Python将加载该脚本,并将所有def带入当前脚本。

def不会被直接导入脚本(除非from foo import *),但可以通过模块名称访问到(foo.xxx)

模块,允许将代码逻辑,拆分为功能性的片段。

引入函数外代码

还可以在导入模块时,包括def以外的代码。它在模块第一次导入时,仅执行一次

但是,大多数情况下,需要避免这么做。因为它容易引发副作用:

  • 如果您导入了同一模块多次,则代码仅会在第一次导入时执行,之后不会再次执行
  • 在模块中使用全局变量也是不推荐的

相反,应该使用函数和本地变量,以确保代码逻辑清晰,并且不会对其他代码造成影响

如:

# foo.py

barJoke = "E-Flat walks into a bar. The bartender says, 'Sorry, we don't serve minors!'"

def bar():
    print(barJoke)

_name_

一个模块,被别的模块引用的时候,_name_ 就会被设置为引用者的名字

如果直接跑这个module,而非引用的话,_name_ 就会被设置为"_main_"

结尾

本篇我们聊了Define、Module两部分,下一篇,我们聊聊package

参考文献

【遇见Python】模块 & 包管理 一些冷门知识点(Part I) - 掘金 (juejin.cn)

ImportError: attempted relative import with no known parent package (iq-inc.com)

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情