如何将C#的lambda函数完整翻译为Python?
我刚接触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表达式是个有趣的技巧,但我强烈建议你在实际代码中不要使用它们!