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

2024-04-29 04:16:33 发布

您现在位置:Python中文网/ 问答频道 /正文

允许一个函数使用另一个函数的返回值的pythonic最佳实践是什么?e、 g.是在另一个函数中调用一个函数更好,还是让function1返回到类,然后分配给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())

Tags: 方法函数selfinputgetusedefpythonic
3条回答

正如import this所说,“显式优于隐式”;所以请使用第一种形式。

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

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

例如,您可以有一个类,它的公共API有两个方法,这两个方法都依赖于您认为是私有的第三个方法。作为开发人员,您可以选择不将第三个方法作为公共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方法中。因为您现在需要从car实例外部的添加附加信息,所以您必须通过公共API将值从一个方法调用传递到另一个方法调用。

请记住,软件开发更多的是一种艺术形式,而不是一个严格的工程纪律,因此,如何做到这一点的答案因开发人员而异,也因软件项目而异。从来没有人回答。试着让它清晰明了,自然。

我认为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()

是一个更合理的解决方案。

相关问题 更多 >