我正在研究一个通用框架,并且在某些时候我试图以通用方式过滤变量。以下面的类为例:
class X:
def __init__(self, val):
self.val = val
val
然后我有一个具有任意值的对象数组:
arr = [X("1"), X("2"), X("2"), X("3"), X("foo"), X("5"), X("3")]
我的目标是有一个函数,它接受一个 lambda 函数和一个变量名作为字符串(因为它们是用户提供的),目前实现如下:
def process(lambda_f_str, var_str):
# should return [1, 2, 3, 5]
return list(set(filter(lambda x: x, map(eval(lambda_f_str), eval(var_str)))))
我希望能够使用给定的 lambda 函数字符串调用此方法,该字符串将仅返回这些对象的唯一整数值(在此示例中,我希望[1 2 3 5]
,顺序无关紧要)。
我试过这样的事情:
process("lambda x: x.val if isinstance(x.val, int) else None", "arr")
但这不起作用,因为整数仍然作为我的数组中的字符串传递(我无法控制,这是用户提供的,所以我无法做出任何假设)。
我想做相当于
try:
int(x)
except:
# do something if not an int
但我不认为你可以在 lambda 函数中做到这一点......你可以吗?至少我还没弄清楚怎么做。
我很想知道如何编写这个 lambda 以通用方式进行过滤。我宁愿避免更改该process
方法,因为这是一个通用函数,为了简洁起见,它执行此示例代码中未包含的其他事情。