首页 > 解决方案 > 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 列名的命令,列的计数和名称是可变的。

标签: pythonexec

解决方案


第一

您可能并不打算使用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

推荐阅读