Наилучшая практика для передачи значений между функциями в Python

Что такое наилучшая практика pythonic, позволяющая одной функции использовать возвращаемые значения другой функции? например Лучше ли вызывать одну функцию в другой, или лучше, чтобы функция1 возвращалась к классу, и назначаются переменные класса, которые затем используются функцией2? Во-вторых, сколько разных способов вы могли бы передавать значения между функциями?

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

Ответ 1

Как import this сказал бы: "явный лучше, чем неявный"; поэтому переходите к первой форме.

Если число возвращаемых значений становится большим, пусть use_value принимает аргумент последовательности.

Ответ 2

Все способы действительны и полностью зависят от вашей предметной области и от компартиментализации функциональности, разделения проблем. Другими словами, зависит от.

Например, у вас может быть класс, открытый API-интерфейс которого имеет 2 метода, которые зависят от третьего метода, который вы считаете приватным. Это ваш выбор в качестве разработчика не для того, чтобы сделать этот 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 вашего 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.

Помните, что разработка программного обеспечения скорее является искусством, чем строгой инженерной дисциплиной, и поэтому ответ о том, как это сделать, варьируется от разработчика к разработчику и от программного проекта до программного проекта. Ни одного ответа никто не отвечает. Просто попробуйте сделать это явным и очевидным, естественным.

Ответ 3

Я бы сказал, что 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()

является более надежным решением.