动态添加功能到现有的导入模块

Posted

技术标签:

【中文标题】动态添加功能到现有的导入模块【英文标题】:dynamically adding a function to existing imported module 【发布时间】:2015-10-20 15:15:40 【问题描述】:

这可能是一个非常幼稚的问题,也许最好用一个例子来问:

module1.py

import module2

def new_func():
    print(var_string)
module2.new_func = new_func

module2.func()
module2.new_func()

module2.py

var_string = "i'm the global string!"

def func():
    print(var_string)

结果

> python module1.py
i'm the global string!
Traceback (most recent call last):
  File "module1.py", line 8, in <module>
    module2.new_func()
  File "module1.py", line 4, in new_func
    print(var_string)
NameError: name 'var_string' is not defined

所以我的问题是: 是否可以将函数插入模块并相应地更新其全局命名空间?

相关:global variable defined in main script can't be accessed by a function defined in a different module 请注意,我知道共享全局变量是一个坏主意,而且我也知道配置模块将是一个很好的折衷方案,但也请注意,这不是我想要实现的目标。

【问题讨论】:

他们没有必要这样做。您可以只使用 if 语句来确定调用哪个方法,或者将哪些参数传递给方法。等等…… 我不同意。我认为这将非常有用。类比是向现有类动态添加一个方法,该类利用该类的其他属性和方法。我还希望这个插入的函数可以被其他模块调用。本质上,我是在动态扩展模块,而不需要对模块的源代码进行物理编辑。 你需要把 print(var_string) 改成 print(module2.var_string) @DamiánMontenegro 不,这不是我要找的。我希望 func 可以直接访问 module2 的全局成员,就好像它最初是在 global2 中定义的一样。 我从来没有这样做过。但是方法是否覆盖了您所说的内容?看看这个链接lgiordani.com/blog/2014/05/19/method-overriding-in-python/… 【参考方案1】:

您可能认为它很有用,但很少有 Python 代码是这样编写的,我认为大多数 Python 程序员都会对这样做的代码感到困惑。在导入后修改模块(monkeypatching)通常被看不起,因为它很容易做错事并导致奇怪的错误。

您将其与类上的覆盖/扩展方法进行了类比,但如果这确实是您想要做的,为什么不直接使用类呢?类的特性使得做这种事情变得更安全、更容易。

如果您这样做,您的代码将起作用:

from module2 import var_string
#or..
from module2 import *

但我不确定这是否是您正在寻找的解决方案。无论哪种方式,我个人都不会尝试让这段代码工作,它与 Python 代码的正常编写方式作斗争。如果您有一个您认为可以通过动态修改模块来改进的实际代码示例,我希望看到它。您提供的示例代码有点难以看出好处。

【讨论】:

公平点。一些上下文:我正在使用日志记录模块,我想向模块添加一个函数(它使用模块中的其他东西),然后我可以从我的应用程序中的其他模块引用它。这是促使我提出这个问题的原始问题。 ***.com/questions/31701470/…【参考方案2】:

我不明白你想要什么,以及这个字符串必须做什么“module2.new_func = new_func”,因为你没有函数 new_funcin module2。 但是如果你想在每个模块中重置变量,你不能这样使用:

模块1:

import module2

def new_func():
    print(var_string)

new_class=module2.MyStuff()
var_string=new_class.func()
new_func()

模块2:

class MyStuff:

    def __init__(self):
        self.var_string  = "i'm the global string!"

    def func(self):
        print(self.var_string)
        return self.var_string

【讨论】:

以上是关于动态添加功能到现有的导入模块的主要内容,如果未能解决你的问题,请参考以下文章

如何将熊猫数据添加到现有的 csv 文件中?

将带有分页的 UIScrollView 添加到现有的 UIViewController

获取新的 MySQL 条目并动态追加到现有的 div

是否可以在 wordpress 中动态地将一个类附加到现有的 div 中?

如何将 SRW 包添加到现有的 Oracle 数据库?

python 把新的dataframe保存到现有的excel新的sheet里面