Python альтернатива глобальным переменным - PullRequest
0 голосов
/ 11 июня 2019

В этом примере у test_function1 есть 4 переменные, которые необходимо использовать в test_funtion2.Я не хотел бы использовать глобальные переменные, потому что реальный код, который я пишу, является более сложным, и он сломает его.

def test_function1():
    a = input("Type aaa:")
    b = "bbb"
    c = "ccc"
    d = "ddd"


test_funtion1()


def test_function2():
    if a == "aaa"
        print(b)
        print(c)
        print(d)


test_function2()

У меня есть решение, но я не уверен, хорошо это или нет. Не могли бы вы сказать мне, будет ли это работать или есть какая-то другая альтернатива. Спасибо!Извините за мою грамматику, английский не является моим основным языком.

def test_function1():
    a = input("Type aaa:")
    b = "bbb"
    c = "ccc"
    d = "ddd"
    return (a, b, c, d)


def test_function2():
    if (test_funtion1()[0]) == "aaa"
        print(test_funtion1()[1])
        print(test_funtion1()[2])
        print(test_funtion1()[3])

Ответы [ 3 ]

2 голосов
/ 11 июня 2019

Я думаю, что вы ищете: классы .

a, b,c, d - это ваше состояние, и создание экземпляра такого класса формирует состояние, которое в основном является ссылочными значениямиэтими четырьмя. Ваша первая функция - это «конструктор» (называемый __init__), а вторая функция может получить доступ к этим «переменным экземпляра» .

1 голос
/ 11 июня 2019

Передача аргументов в функции и возвращение значений из функций - это действительно первый и наиболее очевидный способ избежать глобального состояния - но, по сравнению с вашим фрагментом, вам следует избегать четырехкратного вызова test_function1, что выполняется путем сохранения результата в локальная переменная:

def test_function2():
    result = test_funtion1() 
    if result[0] == "aaa"
        print(result[1])
        print(result[2])
        print(result[3])

или в этом конкретном случае (когда функция возвращает tuple или ny последовательность известной длины), вы можете использовать распаковка кортежей :

def test_function2():
    a, b, c, d = test_funtion1() 
    if a == "aaa"
        print(b)
        print(c)
        print(d)

Кроме того, если у вас есть набор функций, работающих с одним и тем же набором (связанных) переменных, вы можете взглянуть на классы и объекты .

0 голосов
/ 11 июня 2019

Я отредактировал подходящее мне решение:

def test_function1():
    a = input("Type aaa:")
    b = "bbb"
    c = "ccc"
    d = "ddd"
    return a, b, c, d


def test_function2():
    x = test_function1()
    if x[0] == "aaa":
        print(x[1])
        print(x[2])
        print(x[3])


test_funtion2()
...