【发布时间】:2021-04-16 09:49:21
【问题描述】:
好吧,我知道很多人会问“为什么要让人们创建代码?”然后说“不要在字符串上使用 exec!”所以这是思考:
- 我希望我的用户通过提供 IF THEN ELSE 语句来产生覆盖
- 将其解析为 Lambda 函数
- 然后使用 apply 将其应用于 DataFrame
这将是一个例子:
import pandas as pd
If = 'x.b > 2'
Then = 'x.a + 10'
Else = 'x.a'
s = f"MyFunc = lambda x: {Then} if {If} else {Else}"
Df = pd.DataFrame({'a':[1, 1, 1, 2, 2, 2], 'b':[1, 2, 3, 4, 5, 6]})
def RunApply(Df, s):
exec(s)
return Df.apply(MyFunc, axis=1)
RunApply(Df, s)
我也试过了:
def RunApply(Df, s):
Compiled = compile(s, 'MyString', 'exec')
exec(Compiled)
return Df.apply(MyFunc, axis=1)
在这两种情况下,输出都是:
NameError: name 'MyFunc' is not defined
如果您在终端上运行 exec(),它允许您在之后运行 Apply,问题似乎是在 Def 中运行它。我确信这已经解决了,但我发现的许多解决方案都是针对该人遇到的特定问题定制的。就我而言,它是生成 IF..THEN..ELSE 代码,我很高兴听到其他可能不涉及 EXEC 的方法。
谢谢!
更新:
Amit 推荐运行:
import pandas as pd
If = 'x.b > 2'
Then = 'x.a + 10'
Else = 'x.a'
s = f"lambda x: {Then} if {If} else {Else}"
Df = pd.DataFrame({'a':[1, 1, 1, 2, 2, 2], 'b':[1, 2, 3, 4, 5, 6]})
def RunApply(Df, s):
Compiled = compile(s, 'MyString', 'eval')
MyFunc = eval(Compiled)
return Df.apply(MyFunc, axis=1)
RunApply(Df, s)
这可行,但对其他方法感兴趣,以防我们缺少正确的 Pythonic 方式。
【问题讨论】:
-
“我希望我的用户通过提供 IF THEN ELSE 语句来产生覆盖” 这样做您解决了什么问题?您真正需要多大的灵活性?为什么?
-
@KarlKnechtel 因为这是要求。这是一个技术问题,而不是哲学问题。
-
我不知道您试图在“技术”和“哲学”问题之间做出什么区分,但是没有实际考虑和解决抽象编程问题这样的事情 证明要求的合理性。无论如何,除非你正在参加比赛或作业。