You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django调用后端Python执行pandas apply+lambda报NameError如何解决?

问题解决:exec内调用pandas apply+lambda报NameError错误

报错原因

该错误是exec执行上下文的作用域特性导致的:默认状态下,exec内部定义的函数、变量属于exec的局部作用域,而pandas的apply方法调用lambda函数时,运行上下文无法访问到exec的局部作用域内的DD函数,因此抛出name 'DD' is not defined错误。

可行解决方案

方案1:给exec显式传入全局作用域

在调用exec时额外传入globals()作为全局作用域参数,让exec内定义的内容挂载到全局作用域,lambda运行时就能正常访问到DD函数:

import pandas as pd
exec('''DFrame=pd.DataFrame({'A':['11','2','3'],'B':['X','Y','Z']})
print(DFrame.head())
def DD(X,Y):
 return X+Y
DFrame['C']=DFrame.apply(lambda x: DD(x['A'], x['B']), axis=1)
print(DFrame.head())''', globals())

方案2:将函数定义提前到exec外部

如果DD函数的逻辑是固定的,不需要跟随前端传入的自定义代码动态调整,可以直接把函数定义在exec外层的作用域中:

import pandas as pd
# 提前定义公共函数
def DD(X,Y):
    return X+Y

exec('''DFrame=pd.DataFrame({'A':['11','2','3'],'B':['X','Y','Z']})
print(DFrame.head())
DFrame['C']=DFrame.apply(lambda x: DD(x['A'], x['B']), axis=1)
print(DFrame.head())''')

方案3:使用自定义命名空间隔离作用域

如果不想污染全局作用域,可以自定义一个命名空间字典,同时作为exec的全局和局部作用域参数传入,所有exec内定义的内容都会存放在该字典中,既解决作用域问题也避免全局变量冲突:

import pandas as pd
# 自定义命名空间,提前传入exec运行需要的依赖模块
namespace = {'pd': pd}
exec('''DFrame=pd.DataFrame({'A':['11','2','3'],'B':['X','Y','Z']})
print(DFrame.head())
def DD(X,Y):
 return X+Y
DFrame['C']=DFrame.apply(lambda x: DD(x['A'], x['B']), axis=1)
print(DFrame.head())''', namespace, namespace)

# 执行完成后可从命名空间中取出运行结果
# print(namespace['DFrame'])

注意事项

使用exec执行外部传入的自定义代码存在极高的代码注入安全风险,生产环境使用务必做好严格的输入校验、沙箱隔离和权限控制。


内容的提问来源于stack exchange,提问作者Punyesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 04:39:02