调用exec()的Python函数看不到变量

2024-03-28 14:35:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的脚本,它本身可以很好地工作,但一旦我将其全部封装到一个函数中,它就不会返回数据。 命令将根据输入数据结构进行更改。这是我想输入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_数据变量,但我只是得到了一个错误,当我这样做时,它看不到

还是有更好的办法?我需要编写2-x列名的命令,列的计数和名称是可变的


1条回答
网友
1楼 · 发布于 2024-03-28 14:35:46

首先

您可能并不打算使用exec——这是一个相当低级的功能!目前还没有足够的上下文来理解如何解决这个问题。你能写出crosstabcmd函数的样子吗

错误

NameError: name 'cross_data' is not defined

是因为您从未在函数calcct的范围内定义过名为cross_data的变量,也就是说,您从未执行过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

相关问题 更多 >