模块(module)

模块用来从逻辑上组织Python代码实现特定的功能,本质就是*.py文件,一个.py文件就是一个模块

模块的三种来源:

1)系统内置模块,python自带,例如:systimejson模块等

2)自定义模块,自己写的模块,对某段逻辑或某些函数进行封装后供其他函数调用。

注意:自定义模块的命名一定不能和系统内置的模块重名,否则将不能再导入系统的内置模块。例如:自定义了一个sys.py模块后,将不能再使用系统的sys模块。

3)第三方的开源模块:这部分模块可以通过pip install进行安装,有开源的代码。

想使用Python模块文件,需要在另一个python文件里导入模块,可以通过关键字import或from...import导入。

import语法

关键字“import”,后面跟具体的模块名称,导入某一个模块

import module1

 

可以使用一条语句导入多个模块,用逗号分隔

import module1,module2,...

 

也可以使用多条import语句

import module1

import module2

 

说明:

Python本身内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用;

同一个模块不管执行了多少次“import”,只会被导入一次,以防止模块一遍又一遍的被执行;

“import”应该被放在代码的顶端。

 

示例:

接下来我们导入一个自定义的模块,首先定义一个模块,并且把这个模块的名字叫做“demo.py”,如下图所示:

这个模块里定义了一个函数,计算输入的2个参数的和,并打印出来。将这个文件保存,接下来我们看调用方法:

在调用的文件中,只需要输入“import demo”,然后就可以在任意地方调用demo模块中的方法。

 

from...import

刚才我们提到了引入一个模块使用“import”关键字,它将把这个模块整个引入进来,那么,from...import则是引入一个指定部分到当前的命名空间中来

示例:

demo模块定义了两个函数,分别是“sum”和“sub”

现在我们用from...import使用这个模块,并且只想使用第一个函数sum,如下图:

从上面的两个例子,可以看到,“import”和“from...import”的作用都是引入一个模块,它们的区别在于:

“import”是引入一个完整的模块,“from...import”是引入模块中的一个或多个指定部分;

“import”引入模块后,如果需要使用模块里的函数方法,则需要加上模块的限定名字,“from...import”则不用加模块的限定名字,直接使用其函数方法。

 

还有一种引入模块的方法:“from...import*”,举例如下图:

调用sub函数不再提示error了

 “from...import *”把一个模块里的所有函数、变量都一次性的引入进来了(单下划线“_”开头的函数、变量除外),一般绝大多数编程人员不会这么写,有可能会覆盖现有代码的定义。

 

小结

Python中模块化的好处很多,有如下优点:

提高了代码的可维护性;

一个模块编写完毕之后,其他模块直接调用,不用重复编写代码,节省时间;

避免函数名称和变量名称重复,在不同的模块中可以存在相同名字的函数名和变量名,但是,切记,不要和系统内置的模块名称重复。

在 Webpack 中使用 `import` 引入 UMD 模块时,可能会遇到模块无法正确解析或引入的值为空的问题。UMD(Universal Module Definition)是一种通用的模块定义方式,旨在兼容多种模块加载规范(如 CommonJS、AMD 和全局变量)。然而,由于 Webpack 主要基于 ES Module 打包机制,直接使用 `import` 引入 UMD 模块时,可能需要进行额外的配置或处理[^4]。 ### Webpack 引入 UMD 模块的常见问题 1. **引入的值为空或 `undefined`** 这通常是因为 UMD 模块在打包时未正确导出默认值或命名导出。ES Module 的 `import` 语法期望模块导出一个明确的 `export default` 或命名导出,而某些 UMD 模块可能仅通过全局变量暴露接口,导致 Webpack 无法正确识别其导出内容[^4]。 2. **模块加载方式不一致** UMD 模块可能依赖于特定的运行时环境(如全局 `window` 对象),而 Webpack 在打包时可能会优化或重写模块加载逻辑,从而导致 UMD 模块的行为与预期不符。 ### 配置方法 #### 1. 使用 `imports-loader` 和 `exports-loader` 如果 UMD 模块依赖全局变量(如 `window`),可以通过 `imports-loader` 将依赖注入模块作用域中,并使用 `exports-loader` 明确导出模块内容。 ```js // webpack.config.js module.exports = { module: { rules: [ { test: /your-umd-module\.js$/, use: [ { loader: 'imports-loader', options: { additionalCode: 'var global = window;' } }, { loader: 'exports-loader', options: { exports: 'default' } } ] } ] } }; ``` #### 2. 使用 `script` 标签全局引入 如果模块本身是通过全局变量暴露的(如 `window.MyModule`),可以在 HTML 中使用 `<script>` 标签直接引入,并在 Webpack 配置中通过 `externals` 忽略该模块的打包。 ```html <!-- index.html --> <script src="path/to/your-umd-module.js"></script> ``` ```js // webpack.config.js module.exports = { externals: { 'your-module-name': 'MyModule' // 指向全局变量 } }; ``` 然后在代码中通过全局变量访问: ```js const myModule = window.MyModule; ``` #### 3. 使用 `resolve.extensions` 确保正确加载 确保 Webpack 能够正确识别 `.js` 文件扩展名: ```js // webpack.config.js module.exports = { resolve: { extensions: ['.js', '.json'] } }; ``` #### 4. 使用 `module-federation` 插件(如 `npm-federation`) 对于需要跨项目共享模块的场景,可以使用 `npm-federation` 插件,它能够自动处理 UMD 模块与 ES Module 的兼容性问题,实现无感知的远程模块引入[^3]。 ```js // webpack.config.js const NpmFederationPlugin = require('npm-federation'); module.exports = { plugins: [ new NpmFederationPlugin({ remotes: { 'your-umd-module': 'your-umd-module' } }) ] }; ``` ### 示例代码 假设有一个 UMD 模块 `rmb.js`,其导出为 `rmb` 函数: ```js // rmb.js (UMD) (function(root, factory) { if (typeof define === 'function' && define.amd) { define([], factory); } else if (typeof module === 'object' && module.exports) { exports = module.exports = factory(); } else { root.rmb = factory(); } })(this, function() { return function(value) { return value / 100; }; }); ``` 在 Webpack 中引入该模块: ```js import rmb from './rmb'; console.log(rmb(100000)); // 输出 1000 ``` 若引入失败,可尝试通过 `externals` 方式: ```js // webpack.config.js module.exports = { externals: { rmb: 'rmb' } }; // 在代码中使用 const rmb = window.rmb; console.log(rmb(100000)); // 输出 1000 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值