лучшая практика для передачи значений между функциями в Python - PullRequest
10 голосов
/ 04 июня 2011

Какова наилучшая практика использования pythonic для разрешения одной функции использовать возвращаемые значения другой функции?Например, лучше ли вызывать одну функцию внутри другой или лучше, чтобы function1 возвращалась в класс, и присваиваются переменные класса, которые затем используются функцией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())

Ответы [ 3 ]

9 голосов
/ 04 июня 2011

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

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

4 голосов
/ 04 июня 2011

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

Например, у вас может быть класс, открытый 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 абсолютно не нужно напрямую вызывать _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.

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

1 голос
/ 04 июня 2011

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

- более разумное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...