在Python中的函数之间传递值的最佳实践

时间:2011-06-04 09:53:55

标签: function return-value python

允许一个函数使用另一个函数返回值的pythonic最佳实践是什么?例如在另一个函数中调用一个函数是否更好,或者更好的是函数1返回到类,然后分配类变量然后由function2使用?其次,可以在函数之间传递值的方式有多少?

class adding:

    def get_values(self):
        x = input("input x")
        y = input("input y")
        z = input("input z")
        return x, y, z

    def use_values(self, x, y, z):
        print x+y+z

if name == 'main':
    dave = adding()
    x, y, z = dave.get_values()
    dave.use_values(x, y, z)

或者

    dave = adding()
    dave.use_values(*dave.get_values())

3 个答案:

答案 0 :(得分:9)

正如import this所说,“明确胜过隐性”;所以选择第一种形式。

如果返回值的数量变大,请让use_value改为使用序列参数。

答案 1 :(得分:4)

所有方式都是有效的,完全取决于您的主题领域和功能的划分,关注点的分离。换句话说,取决于

例如,您可以拥有一个类,其公共API有两个方法,它们都依赖于第三个方法,您认为它是私有的。作为开发人员,您可以选择不将第3个方法作为公共API的一部分,但它在源代码中存在:

class FooAPI(object):
    def publicMethodOne(*args, **kw):
        return self._privateMethod(1, *args, **kw) + 7

    def publicMethodTwo(*args, **kw):
        return self._privateMethod(2, *args, **kw) + 11

    def _privateMethod(somevalue, *args, **kw):
        return somevalue * 3

在这种情况下,您的API用户绝对不需要直接调用_privateMethod并将其返回值传递给publicMethod

但是,如果您认为API的使用者应该为您的方法提供特定信息,在大多数情况下,有一个简单的默认方法可以为他们计算特定信息,您可能希望传递返回值那种默认方法。这样,那些消费者也可以使用他们自己的计算方法并使用代替这些值:

def publicMethod(value1, value2):
    return value1 / value2

def mostCommonValues():
    return (1.0, 4.0)

publicMethod(*mostCommonValues())
publicMethod(4, 2)

何时使用实例变量?只有当函数的返回值与实例一起持久时,它们才会反映该实例的内部状态。

例如,如果您的班级代表汽车,那么您的应用程序可能有意义将汽车的位置存储在该汽车的操作之间。因此,如果您想知道现在是否需要停在红绿灯处,请先调用updatePosition()方法,然后使用其他方法计算红绿灯的距离。您不会将updatePosition()调用的输出传递给距离计算方法,您只需在实例中更新位置。

但是,如果您需要在碰撞中更新汽车的位置,则需要从汽车中获取数据(基于汽车上调用的方法的返回值),并结合外部信息(其他位置)物体,路面阻力等)反馈到汽车上的updatePosition方法。因为您现在需要从汽车实例的外部添加其他信息,所以您必须通过公共API将值从一个方法调用传递到另一个方法调用。

请记住,软件开发更像是一种艺术形式,而不是严格的工程学科,因此如何做到这一点的答案因开发人员,开发人员以及软件项目而异。从来没有人回答过。试着让它明确而明显,自然。

答案 2 :(得分:1)

我认为get_values不是添加的重要部分,因此应该是一个单独的功能。如果它应该是我会说:

class adding:

def get_values(self):
    self.x = input("input x")
    self.y = input("input y")
    self.z = input("input z")

def use_values(self):
    print self.x+self.y+self.z

if name == 'main':
    dave = adding()
    dave.get_values()
    dave.use_values()

是一个更健全的解决方案。