我知道这种模式是非常糟糕的,我问这个问题是出于好奇,而不是因为我计划在生产代码中这样做.

假设我定义了一个函数:

def function(x, y):
    return x + y + z

并且变量z在定义该函数的模块中不存在.

有没有可能从另一个模块导入函数并以某种方式操作代码对象,或者使用修饰器或其他东西玩一些肮脏的把戏,以使其正常工作?

我已经try 将co_varnamesco_argcount分别设置为(x, y, z)3,但这仍然没有将名称z与似乎的参数绑定在一起.

需要明确的是,我知道如果我在相同的模块中定义一个全局名为z的函数,我询问的是如何导入此函数,并以某种方式将z绑定到我想要的另一个模块中的变量.

推荐答案

可以使用该函数的代码为create a new function,并使用不同的全局变量:

# create module for demo
with open('module.py', 'w') as f:
    f.write('''
def function(x, y):
    return x + y + z
''')

from module import function

function = type(function)(function.__code__, globals())

z = 100
print(function(20, 3))

输出(Try it online!):

123

或者,如果您想要一个不同的变量名,可以在调用函数之前使用一个将变量的值设置为z的"修饰符":

from module import function

f = function
def function(*args):
    f.__globals__['z'] = foobar
    return f(*args)

foobar = 100
print(function(20, 3))

Try it online!

Python相关问答推荐

在Python中是否可以输入使用任意大小参数列表的第一个元素的函数

在Python中使用readline函数时如何向下行

如何在不使用字符串的情况下将namedtuple属性传递给方法?

KNN分类器中的GridSearchCV

已删除的构造函数调用另一个构造函数

是pandas.DataFrame使用方法查询后仍然排序吗?

在matplotlib动画gif中更改配色方案

列表上值总和最多为K(以O(log n))的最大元素数

Python多处理:当我在一个巨大的pandas数据框架上启动许多进程时,程序就会陷入困境

输出中带有南的亚麻神经网络

Polars:用氨纶的其他部分替换氨纶的部分

通过pandas向每个非空单元格添加子字符串

无法使用DBFS File API路径附加到CSV In Datricks(OSError Errno 95操作不支持)

将9个3x3矩阵按特定顺序排列成9x9矩阵

在vscode上使用Python虚拟环境时((env))

为一个组的每个子组绘制,

使用Python从URL下载Excel文件

旋转多边形而不改变内部空间关系

如何杀死一个进程,我的Python可执行文件以sudo启动?

在方法中设置属性值时,如何处理语句不可达[Unreacable]";的问题?