假设我有两个模块:
py
value = 3
def x()
return value
b.py
from a import x
value = 4
我的目标是使用a.x
in的功能b
,但更改该函数返回的值。具体来说,即使我运行,value
也将其查找a
为全局名称的来源b.x()
。我基本上是在尝试创建功能对象的副本,该副本与之b.x
相同a.x
但用于b
获取其全局变量。是否有合理而直接的方法?
这是一个例子:
import a, b
print(a.x(), b.x())
结果是当前3 3
,但我希望如此3 4
。
我想出了两种可行的复杂方法,但是我对其中任何一种都不满意:
x
在模块中重新定义b
。真正的功能比显示的要复杂得多,因此这并不适合我。def x(value):
return value
这给我要避免的用户增加了负担,并不能真正解决问题。
有没有办法修改该函数以某种方式获取其全局变量的位置?
我已经通过猜测和检查以及研究的结合提出了一个解决方案。您几乎可以完全按照我在问题中的建议进行操作:复制函数对象并替换其__globals__
属性。
我正在使用Python
3,因此这是上面链接的问题的答案的修改后的版本,带有一个覆盖全局变量的附加选项:
import copy
import types
import functools
def copy_func(f, globals=None, module=None):
"""Based on https://stackoverflow.com/a/13503277/2988730 (@unutbu)"""
if globals is None:
globals = f.__globals__
g = types.FunctionType(f.__code__, globals, name=f.__name__,
argdefs=f.__defaults__, closure=f.__closure__)
g = functools.update_wrapper(g, f)
if module is not None:
g.__module__ = module
g.__kwdefaults__ = copy.copy(f.__kwdefaults__)
return g
b.py
from a import x
value = 4
x = copy_func(x, globals(), __name__)
该__globals__
属性是只读的,因此必须将其传递给的构造函数FunctionType
。__globals__
现有功能对象的引用不能更改:为什么func
.__ globals__被记录为只读?
。
问题内容: 我遇到了一些在Python脚本中导入模块的问题。我将尽力描述错误,为什么会遇到错误以及为什么要使用这种特殊方法来解决我的问题(我将在稍后描述): 假设我有一个模块,其中定义了一些实用程序函数/类,这些函数/类引用在此辅助模块将导入到的命名空间中定义的实体(让“ a”成为这样的实体): 模块1: 然后,我有了主程序,其中定义了“ a”,我要将这些实用程序导入其中: 执行该程序将触发以下错
问题内容: 我有一个似乎很基本的问题,但我似乎在任何地方都找不到任何帮助。 XYZ.doSomething()无法说出NameError:未定义名称“ XYZ”即使从file_a完成的标准导入(如“ import sys”)似乎也无法使其在file_b中可用。我以为应该工作。我的理解错了吗?如果是,那么是否有办法在文件之间具有通用的导入和全局变量?(如果没有帮助,我曾经是C ++和Java程序员,
问题内容: 我从很多地方都听说过,全局变量本来就是讨厌和邪恶的,但是当使用一些非面向对象的Javascript时,我看不到如何避免它们。说我有一个函数,它使用复杂的算法使用随机数和填充物来生成数字,但是我需要在其他函数(回调或其他函数)中继续使用该特定数,因此不能成为同一函数的一部分。 如果最初生成的数字是局部变量,则无法从那里访问它。如果函数是对象方法,我可以将数字设为属性,但是它们不是属性,并
问题内容: 我想了解如何从导入的模块执行功能。 这是我到目前为止的位置。 app / mocking.py: app / my_module / init.py: 测试/模拟测试.py: 这不 符合 我的预期。“已修补”模块仅返回的未模拟值。如何模拟要导入到被测名称空间中的其他包中的方法? 问题答案: 当您从包中使用装饰器时,您 未在 修补名称空间(从本例中导入模块),而是在被测试的名称空间中对其
我制作了我的python模块,它<code>A。py使用如下所示。在这种情况下,如何导入<code>B。py在?我想使用其他目录中的模块。但由于路径问题,我的代码无法工作。 A.py 碧桂园 main _ in _ mylib.py 主.py ModuleNotFoundError:没有名为“B”的模块 ModuleNotFoundError:没有名为“B”的模块
问题内容: 我担心这是解决问题的麻烦方式,但是… 假设我想根据某些条件在Python中进行一些导入。 因此,我想编写一个函数: 现在如何使导入的模块全局可用? 例如: 问题答案: 导入的模块只是变量-名称绑定到某些值。因此,您所需要做的就是导入它们,并使用关键字使它们成为全局的。 例: