将函数放在类方法中是不是一种糟糕的编程实践?

时间:2018-04-16 15:08:32

标签: python oop

我正在看这样的案例:

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())

它有效,但还有更好的方法吗?

5 个答案:

答案 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。 ;)