向操作系统内置模块添加方法

问题描述 投票:0回答:1

我的理解是os不是一个类,而是一个内置模块。因此我不能对它进行子类化?是这样吗?

然后我尝试简单地将方法添加到操作系统中(见下文)。虽然可以正确编译并工作,但该方法不会出现在我的 vscode 自动完成/智能感知中。

诗。如果这确实是“猴子修补”,那么请指出,我会避免。但一般来说,我喜欢在相关小组中组织职能。因此,在下面的示例中,我喜欢向我经常重复使用的操作系统相关代码添加一个方法。

感谢您提前提供信息。

import os
def myfunc(): print('function works')
os.myfunc = myfunc()
os.myfunc()            # Works but doesn't autocomplete 

python module subclass built-in
1个回答
0
投票

基于this线程,这是monkeypatching。模块是 python 中的对象,因此在为其分配属性时,它们的行为就像对象一样。

我相信 vscode python 扩展使用 pylance 语言服务器来提供编辑器提示和语法/语义突出显示。 pylance 团队实际上明确拒绝了为此类场景提供自动完成和提示的想法。

我只能想到几种情况(或多或少)这是Python中公认的做法。其中之一是模拟 pytest 单元测试的外部服务。另一种(可能)是在已知方法包含恶意代码后清理某些不安全的模块/类,例如,如果您的应用程序处理潜在不安全的用户提交的代码或腌制对象等。这两种情况之间的共同因素是在这两种情况下,人们都会通过猴子补丁来绕过预期的功能。对于绝大多数潜在用例来说,这绝对是一个坏主意,特别是当 Monkeypatched 对象与

os
模块一样重要且核心时。

编辑:

如果你有兴趣,你实际上可以在 pytest 文档中看到模块级 Monkeypatching 的用法

© www.soinside.com 2019 - 2024. All rights reserved.