我正试图用尽可能最蟒蛇的方式写这个,但我现在才开始学习lambda(以及它们可以结合的东西),而且我遇到了一些困难。
使用mechanize
模块我正在抓取一个网站以获取选择控件,并尝试将每个选项值提交到表单并阅读结果内容(也许我试图为一点点做太多' ol声明)。这就是我所拥有的:
f = "ctl00$holdSection$selSubAgentFilter" #the select box field name
self.br.select_form(nr=0) #make the form selection in the browser instance
#here's where the magic is done
map( (lambda item,f=f: print(self.br.form.find_control( f ).items[ item[0] ].selected.submit().read() ) ), enumerate( self.br.find_control( f ).items ) )
所以,为了打破它,我正在努力做到以下几点:
map
函数以基本上“遍历”每个列表项map
执行的函数print()
将其恢复为stdout 当然,在这种情况下,链式方法的selected
属性求值为布尔值并发出以下错误:
AttributeError: 'bool' object has no attribute 'submit'
但是你知道我想要完成什么,我只是不确定如何,并以最小的占地面积完成它 - 我可以使用几行和for循环工作,我只是试图远离那个,如果可能的话。我试图以最pythonic的方式分支并克服问题,而不是最简单的方法。
有什么想法吗?
答案 0 :(得分:1)
最“Pythonic”的方式是最易读的方式。如果for循环对你有效,那么肯定不需要做map,filter或lambda。
何时使用列表推导,地图,过滤器等的一个不错的经验法则是,如果您正在处理数据列表,请使用理解,地图和过滤器。如果您正在执行重复逻辑,例如对列表中的每个项目进行操作,那么您可以执行for循环。
示例1:我需要从列表中过滤掉不必要的数据,因此我需要理解。
new_list = [item for item in list if item.has_special_property]
示例2:我需要为列表中的每个项目运行一些操作,所以我做了一个for循环。
for item in list:
log_important_info(item)
这些是明显简化的示例,但我希望您看到示例1适用于数据,而示例2适用于代码。
无论如何,我会使用for item in option
循环,在表单中选择适当的元素,并在循环内提交它。您和其他任何人都会非常清楚地看到您的代码正是您正在做的事情,特别是如果您发表评论。
如果我在项目中遇到它,上面编写的代码很难立即理解。
如果你想了解Pythonic的真正含义,那么我强烈建议你阅读PEP-8。