Lambda 和 eval 在函数内部不起作用

Lambda and eval doesn't working inside a function

我是 python 的新手,非常感谢您对我以下问题的帮助。

问题:

我正在 Dataframe 上进行关键字匹配,我确实在 Jupyter notebook 中尝试了代码,它运行得非常好。但是,相同的代码在 Visual Code 中不起作用。 Jupyter Notebook 和 VS Code 在相同的 python 环境中 运行。

输入数据帧:

note
-----------------
I have a kayak
I have a jet-ski
I have a canoe
I have a jetski

神奇的代码:

def extract():
    keywords = ['kayak','jetski']

    kayak = re.compile(r'.*(pin.pad|pinpad).*')
    jetski= re.compile(r'.*(jetski|jet.ski).*')

    for i in keywords:
        df[i] = df['note'].apply(lambda x: bool(eval((i)).match(x)))

我确实在 Jupyter 中收到了预期的输出,但是 Visual Code 指出以下错误。

File "xyz.py", line 8, in <lambda>
    df[i] = df['note'].apply(lambda x: bool(eval((i)).match(x)))
  File "<string>", line 1, in <module>
NameError: name 'kayak' is not defined

预期输出:

note                  kayak       jetski
-----------------------------------------
I have a kayak         True        False
I have a jet-ski       False       True
I have a canoe         False       False
I have a jetski        False       True

如果此问题已得到解答或需要更多信息,请告诉我。 :)

不要在这里使用 eval。只需定义一个 dict 将“kayak”和“jets”映射到适当的对象。

def extract():
    keywords = {
       'kayak': re.compile(r'.*(pin.pad|pinpad).*'),
       'jetski': re.compile(r'.*(jetski|jet.ski).*')
    }

    for keyword, regex in keywords.items():
        df[keyword] = df['note'].apply(lambda x: bool(regex.match(x)))

问题是你的两个变量不存在于由 lambda 表达式创建的函数的局部作用域中,但它们也不存在于全局作用域中。普通的 dict 查找比正确调用 eval 简单得多。