3

我正在研究一个通用框架,并且在某些时候我试图以通用方式过滤变量。以下面的类为例:

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方法,因为这是一个通用函数,为了简洁起见,它执行此示例代码中未包含的其他事情。

4

2 回答 2

0

试试这个...

s = "lambda x: int(x.val) if x.val.isdigit( ) else None"
print process(s, "arr")

我回...

[1、2、3、5]

请注意,.isdigit( )如果数字以逗号或小数形式给出,该方法将失败。

于 2012-05-11T18:06:27.497 回答
0

你真的需要评估吗?

f = lambda x: x.val if isinstance(x.val, int) else (int(x.val) if isinstance(x.val, basestring) and x.isdigit() else None)

不是 100% 的证明,例如它不需要123L哪个是有效的 Python。

于 2012-05-11T18:08:40.517 回答