gpt4 book ai didi

python - 为什么 `eval` 在 Python 类函数中不起作用?

转载 作者:行者123 更新时间:2023-12-04 16:54:11 25 4
gpt4 key购买 nike

假设我有一个带有 Pandas 数据框的 Python 类 df作为属性。我要查询df通过释放一个或多个预定义的查询,使用一个类函数,一个或多个查询句柄作为参数提供给它:

import pandas as pd
import numpy as np

class doorn:
def __init__(self):
self.name = 'foo'
self.df = pd.DataFrame(data={'A':np.arange(0, 10), 'B':np.arange(5, 15), 'C':np.arange(14, 24)}, index=[x for x in range(0, 10)])

def query_df(self, *query):
# query arguments must by formatted as 'q1', 'q2' etc
queries = [q for q in query]

q1 = self.df.loc[self.df.A > 2].index
q2 = self.df.loc[self.df.B < 13].index
q3 = self.df.loc[self.df.C > 15].index

sel_rows = set().union(*[eval(x, globals(), locals()) for x in queries])

self.df = self.df.loc[sel_rows]

现在,似乎 eval找不到它提供的查询字符串的实例:
>>> foo = doorn()
>>> foo.query_df('q1', 'q2')
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 17, in query_df
File "<input>", line 17, in <listcomp>
File "<string>", line 1, in <module>
NameError: name 'q1' is not defined

我的猜测是 q1 , q2 , q3不存在于行理解命名空间中。或者其他什么,因为我还没有真正了解命名空间。我尝试通过提供 globals() 来解决这个问题和 locals()作为 eval 的附加参数,正如 docs 中所建议的,但没有成功。

我该如何解决这个问题?我什至可以不使用 eval共?

最佳答案

我想这是因为locals()在您的理解循环中与您的函数中的不同,因此它们不包含“q1”。您可以使用全局变量,但我不推荐这样做。
此外,将 eval 与可能来自用户输入的内容一起使用可能是危险的,因为它可以执行恶意代码。

我建议您将预定义查询列表存储在字典中,如下例所示:

class doorn:
def __init__(self):
self.name = 'foo'
self.df = pd.DataFrame(data={'A':np.arange(0, 10), 'B':np.arange(5, 15), 'C':np.arange(14, 24)}, index=[x for x in range(0, 10)])

def query_df(self, *query):
# query arguments must by formatted as 'q1', 'q2' etc
queries = [q for q in query]

possible_queries = {'q1' : self.df.loc[self.df.A > 2].index,
'q2' : self.df.loc[self.df.B < 13].index,
'q3' : self.df.loc[self.df.C > 15].index}

sel_rows = set().union(*[possible_queries[x] for x in queries])

self.df = self.df.loc[sel_rows]

希望这会帮助你。

关于python - 为什么 `eval` 在 Python 类函数中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61497369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com