python - Python - 调用 exec() 的函数看不到变量
问题描述
我有以下脚本,它自己运行良好,但是一旦我将它全部包装到一个函数中,就不会返回数据。该命令根据输入数据结构而变化。这是我想输入 exec() 的命令示例:
cross_data=pd.crosstab(src_data['result'],[src_data['c1'],src_data['c2']],normalize='index')
这是我要包装代码并调用的函数:
def calcct(file_path='src_data.csv', separator = ",", res_col = 'result'):
#define function
src_data = csv_import(file_path, separator) #import data
reorder_cols = reorder_columns(src_data, res_col) #work with data
head_list=list(reorder_cols.columns.values) #get dataframe headers
# create command based on headers and execute that. Should return dataframe called cross_data.
exec(crosstabcmd(head_list))
return cross_data
结果是:
NameError: name 'cross_data' is not defined
我似乎找不到在函数内调用 exec 的正确语法。我尝试定义和传递 cross_data 变量,但我只是得到一个错误,当我这样做时它看不到 pandas。
或者有什么更好的方法吗?我需要编写 2-x 列名的命令,列的计数和名称是可变的。
解决方案
第一
您可能并不打算使用exec
- 这是一个非常低级的功能!还没有足够的上下文来理解如何解决这个问题。你能写出(在你的问题中)这个crosstabcmd
函数是什么样子的吗?
错误
NameError: name 'cross_data' is not defined
是因为你从来没有定义过cross_data
在函数范围内调用的变量calcct
,也就是说你从来没有做过cross_data = "something"
。
我会试一试
假设你有类似的东西
import pandas as pd
def crosstabcmd(head_list):
# ? I can only guess what your crosstabcmd does, this won't work though
return pd.crosstab(*head_list, normalize='index')
那么解决方案将如下所示:
def calcct(file_path = 'src_data.csv', separator = ",", res_col = 'result'):
src_data = csv_import(file_path, separator) #import data
reorder_cols = reorder_columns(src_data, res_col) #work with data
head_list=list(reorder_cols.columns.values) #get dataframe headers
cross_data = crosstabcmd(head_list)
return cross_data