Правильный способ заставить функции взаимодействовать друг с другом - PullRequest
1 голос
/ 10 ноября 2019

Я пишу очень простое приложение. Я могу заставить его работать двумя способами:

  1. def a():
        xxxxx
        return data
    
    def b():
        data = a()
        //use data in function
        return yyy
    
    if __name__ == "__main__":
        output = b()
        print(output)
    
  2. def a():
        xxxxx
        return data
    
    def b(data):
        return yyy
    
    if __name__ == "__main__":
        data = a()
        output = b(data)
        print(output)
    

Я ищу полезную информацию или документы окак создать свои функции. Оба приведенных выше примера работают, но как сделать так, чтобы функции взаимодействовали друг с другом? Я думаю, что некорректно использовать функцию main для вызова почти каждой функции и возврата ее туда, но первый пример кажется мне немного странным, поскольку функция b полностью зависит от a без параметра.

Есть ли какое-то четкое объяснение или руководство о том, как это сделать?

Ответы [ 2 ]

2 голосов
/ 10 ноября 2019

Независимость лучше - вы можете повторно использовать b с другими данными (например, c(), который генерирует некоторые другие данные). Также более ясно, что происходит - b работает с данными, которые вы вводите, а не с каким-то "магическим" соединением с a.

Если вы изменили a(), возможно, вам также придется изменить b(), чтобы по-прежнему иметь возможность использовать a() - это жесткая связь ( больше ... ) и, как правило, нежелательно,

Если у вас действительно есть жесткие зависимости и вы просто хотите добавить меньше кода для каждой функции, рассмотрите внутренние функции:

def getStringOfNumbersTimes2(numbers):
    """Returns a string containing the input numbers multiplicated by 2"""
    def mult2():
        """Mults each number by 2."""
        return [n*2 for n in numbers]

    # create the string - with : in between numbers
    return ' : '.join(map(str,mult2()))

print(getStringOfNumbersTimes2([1,2,3]))
print(getStringOfNumbersTimes2([9.42,8.31,7.2]))

Вывод:

2 : 4 : 6
18.84 : 16.62  :14.4

Этовыдуманный пример - я сделал бы это только в том случае, если мне никогда не нужно mult2 вне getStringOfNumbersTimes2 и я хочу, чтобы getStringOfNumbersTimes2 выводил только вдвое больше, чем я даю.

1 голос
/ 10 ноября 2019

Все всегда зависит от варианта использования, над которым вы работаете.

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

Преимущества варианта 2 состоят в том, что тогда вы можете повторно использовать методы в нескольких сценариях, поэтому b теперь просто ожидает data, даже если оно исходит от a или длядругой будущий метод. И данные из a также можно будет использовать в нескольких местах.

Более того, второй вариант упрощает написание модульных тестов отдельно для каждой функции и выглядит как реализация, к которой вы прибегнете в случае использования TDD.

Надеюсь, это поможет.

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