从导入的模块覆盖导入模块的内置功能

用户名

我有一个应用程序,当发生条件时,我想在其中覆盖某些功能,例如:

condition_check.py:

Flag = True
import ctypes  # An included library with Python install.
import inspect
def MsgBox(msg):
    ctypes.windll.user32.MessageBoxA(0, msg, 'MsgBox', 1)
def check():
    global print
    if Flag:
        def print(msg):
                MsgBox(msg)
    else:
        pass

main.py:

## works
from condition_check import *
MsgBox('this is msgbox')
print('this is a print')

## does not work
import condition_check
condition_check.MsgBox('this is msgbox')
print('this is a print')

据我所知,condition_check.py是压倒自己的print,而不是main.pyprint我相信检查库可以用于此目的,但我无法查找示例。

探测

我假设您使用的是Python3。如果您使用的是Python,则只需要设置内置模块的属性即可。

import builtins
import ctypes

original = builtins.print
Flag = True

def MsgBox(msg):
    ctypes.windll.user32.MessageBoxA(0, msg, 'MsgBox', 1)

def check():
    if Flag:
        builtins.print = MsgBox
    else:
        builtins.print = original

但是,我会注意以下几点:

  1. Flag之所以不是好名字,有两个原因:1,它根本不是描述性的。标志仅仅表示它是TrueFalse; 它没有说明它的用途。如图2所示,Python的官方样式指南(PEP 8)对于常规变量建议使用snake_case而不是PascalCase。PascalCase应该仅用于类。

  2. from <module> import *PEP 8不建议使用通配符导入(),因为通配符导入()不清楚名称空间中存在哪些名称,这会混淆读取器和自动化工具。(几乎是Imports一节中的准确报价。)

  3. 您不需要重写该print函数。更好的方法是重写sys.stdout到控制流向的流:

    import ctypes
    import sys
    
    def MsgBox(msg):
        ctypes.windll.user32.MessageBoxA(0, msg, 'MsgBox', 1)
    
    class Printer:
        def __init__(self, original, alternate, use_alternate):
            self.original = original
            self.alternate = alternate
            self.use_alternate = use_alternate
    
        def write(self, msg):
            if self.use_alternate:
                return self.alternate(msg)
            return self.original(msg)
    
    sys.stdout = printer = Printer(sys.stdout.write, MsgBox, True)
    

    那么,您的标志是printer.use_alternate除了易于控制之外,它还与Python 2兼容,即使Python 2print是一个语句也是如此。这样做确实有一个缺点,就是要保留print添加的换行符,但是总可以使用alternate诸如lambda msg: MsgBox(msg.strip())

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

导入后覆盖模块功能-Python

来自分类Dev

Python:从已导入的模块导入功能

来自分类Dev

包含主模块功能的导入模块

来自分类Dev

Powershell不从模块导入功能

来自分类Dev

定义功能后导入模块

来自分类Dev

导入动态加载模块的功能

来自分类Dev

从sys导入退出是运行内置功能还是从模块运行退出功能?

来自分类Dev

从...导入或导入...至模块

来自分类Dev

为什么导入模块与覆盖打印冲突?

来自分类Dev

覆盖导入中已安装的模块

来自分类Dev

Angular 2 + Lazyloaded Module 被导入的模块覆盖

来自分类Dev

直接从Python 3模块导入功能

来自分类Dev

如何防止从模块中导入功能?

来自分类Dev

从Python中的模块导入特定功能的要点

来自分类Dev

节点模块中的导入功能(alphavantage)

来自分类Dev

iPython:如何从模块导入新添加的功能?

来自分类Dev

如何防止从模块中导入功能?

来自分类Dev

导入的模块未获取功能补丁

来自分类Dev

(Python)为什么不在功能中导入模块,而不是在导入模块时先导入最佳方法?

来自分类Dev

在python中,为什么要从内置模块导入“对象”?

来自分类Dev

避免在导入的模块中导入模块

来自分类Dev

导入的python模块将覆盖选项解析器

来自分类Dev

与文件同名的导入模块

来自分类Dev

PySpark分发模块导入

来自分类Dev

python:如何导入模块

来自分类Dev

封装导入模块的范围

来自分类Dev

导出导入的模块

来自分类Dev

无法导入模块

来自分类Dev

从python删除导入的模块