лучшая практика передачи значений между функциями в 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())
3 ответов
As import this
сказал бы:" явное лучше, чем неявное"; поэтому перейдите к первой форме.
Если количество возвращаемых значений становится большим, пусть use_value
вместо этого возьмите аргумент последовательности.
все способы действительны и полностью зависят от вашей предметной области и разделения функций, разделения проблем. Другими словами,зависит.
например, у вас может быть класс, открытый API которого имеет 2 метода, которые зависят от 3-го метода, который вы считаете частным. Это ваш выбор как разработчика, чтобы не сделать этот 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.
помните, что разработка программного обеспечения-это скорее артформ, чем строгая инженерная дисциплина, и поэтому ответ о том, как это сделать, варьируется от разработчика к разработчику и от программного проекта к программный проект. Ответа никогда не бывает. Просто попытайтесь сделать это явным и очевидным, естественным.
Я бы сказал, что 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()
является более разумным решением.