我正在看这样的案例:
def parse_item(self, response):
item = MetrocItem()
def ver(string):
if string:
return string
else:
return 'null'
item['latitude'] = ver(response.xpath('//input[@id="latitude"]/@value').extract_first())
它有效,但还有更好的方法吗?
答案 0 :(得分:3)
正如@Graipher在评论中提到的,这在某些情况下肯定是有效的,但在您的特定情况下,这是不必要的。如果您的函数依赖于局部变量,那么每次调用该方法时,您都需要返回需要重建的闭包。但是在你的情况下,每次调用方法时函数的行为方式都相同,因此将它作为私有方法全局定义,或者甚至在你的情况下作为lambda更有意义。
ver = lambda x: x if x else 'null'
但首选方法是简单地全局定义并使用下划线开头,以明确意图。
def _ver(string):
...
答案 1 :(得分:2)
你可以完全摆脱这个功能:
string = response.xpath('//input[@id="latitude"]/@value').extract_first()
item['latitude'] = string if string else 'null'
答案 2 :(得分:1)
有一些用例具有本地函数 - 无论是在类方法还是其他方法中,比如你想要一个闭包捕获一些本地函数。
在你的情况下,你想要像colasecing null这样的东西:
e.g。
>>> s = None
>>> s or "None"
'None'
所以,你可以使用
item['latitude'] = response.xpath('//input[@id="latitude"]@value').extract_first() or "null"
答案 3 :(得分:1)
这不是一种不好的做法,但这是另一种选择。
由于这个小功能并不依赖于parse_item
中的任何内容,并且您可能希望它只构造一次,为了提高性能,您可以这样做:
def parse_item(self, response):
...
def _ver(string):
...
parse_item.ver = _ver
del _ver
并在parse_item
内将其称为parse_item.ver
,而不只是ver
。这样可以避免使全局命名空间混乱,即使使用Python部分隐藏的强调方法也是如此。
我会推荐lambda表达式作为另一种选择,但是Silvio首先得到它。
此外,它可能是一个全局功能的评论,只有在任何其他地方都可以使用的情况下才有意义。
另外,你可以完全取消这个例子,正如医生和Niklas所建议的那样,但我认为你的意思是更复杂的案例。
答案 4 :(得分:0)
我猜parse_item
是你班级内的一种方法。然后你就可以使用Python" private"使代码更具可读性和清晰度的方法。
检查如何撰写Python "private" method,然后检查why it's not actually a private method。 ;)