如何将C#的lambda函数完整翻译为Python?

-2 投票
2 回答
1101 浏览
提问于 2025-04-18 09:43

我刚接触lambda表达式,想知道C#中的return语句怎么能转换成Python,是否可行。

WebDrivrWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
var imagesLink = wait.Until(d => 
                               {
                                  var elements = driver.FindElements(By.ClassName("kl"));
                                  if (elements.Count > 0)
                                  return elements[0];
                                  return null;
                               });
imagesLink.Click();

简单的selenium显式等待在我这里不太管用,几乎每次运行FB测试时都会出现超时错误。到目前为止,我已经搞清楚了等待赋值的函数,但不知道怎么在lambda中创建变量和if语句以及返回值。有没有好的教程推荐一下?

2 个回答

1

Python中的lambda函数功能比较有限,只能包含一个简单的表达式。虽然从理论上讲,你可以把C#示例中的lambda写成一个表达式,但因为不能进行赋值操作,你就得调用一次driver.FindElements两次,这样写起来就显得冗长而且效率低。与其这样,不如使用一个有名字的函数。

0

这是可能的(不过看起来很丑,容易让人困惑,而且没必要),不需要调用find_elements两次,可以用嵌套的lambda表达式来实现:

f = lambda: (lambda x: x[0] if len(x) > 0 else "Argh" )([1,2,3])
f()  # returns 1

f = lambda: (lambda x: x[0] if len(x) > 0 else "Argh" )([])
f()  # returns "Argh"

所以在你的selenium例子中,你可以这样做:

wait = WebDriverWait(driver, 10)
wait.until(lambda d: (lambda x: x[0] if len(x) > 0 else None)(d.find_elements_by_class_name("k1")))

不过,因为你只是想返回第一个元素,所以你可以用selenium 2的预期条件API来更简单地实现:

wait.until(EC.presence_of_element_located((By.CLASS_NAME, "k1"))

嵌套的lambda表达式是个有趣的技巧,但我强烈建议你在实际代码中不要使用它们!

撰写回答