Доступ к python переменным из других python модулей, находящихся внутри функции - PullRequest
0 голосов
/ 05 августа 2020

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

Итак, у меня есть два файла .py.

Первый: (first.py)

from second import *
function(10, 30)
print(answer)

Второй: (second.py)

def function(one, two):
     global answer
     answer = one + two

Итак, второй. py создает глобальную переменную, а first.py импортирует second.py и пытается распечатать my_var. Но по какой-то причине я всегда получаю это сообщение об ошибке:

Traceback (most recent call last):
  File "first.py", line 3, in <module>
    print(answer)
AttributeError: module 'second' has no attribute 'answer'

...

Могу я попросить помощи, пожалуйста? Я очень старался, но, ради Господа, не мог понять!

Ответы [ 5 ]

1 голос
/ 05 августа 2020

Было бы лучше, если бы ваша функция возвращала значение:

def function(one, two):
     answer = one + two
     return answer

, тогда вы могли бы настроить свой другой файл следующим образом:

from second import function
answer = function(10, 30)
print(answer)

также функция ужасная имя для функции назовите это описательным

0 голосов
/ 05 августа 2020

Используйте return. Если вы хотите вернуть несколько ответов, попробуйте следующее.

first.py:

from second import function

ans1, ans2 = function(1, 2, 3)
print(ans1, ans2) # 3 5

second.py:

def function(one, two, three):
    answer1 = one + two
    answer2 = two + three
    return answer1, answer2
0 голосов
/ 05 августа 2020

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

from second import *

, он копирует имена из second.py в пространство имен first.py. Итак, если вы переназначаете любую переменную second.py (в вашем случае answer) в first.py, изменение будет выполнено только в first.py, а не в second.py. Итак, я надеюсь, вы поняли, что first.py's answer и second.py's answer каждый из них занимал разные места в памяти. Для вашего понимания я написал тест, прочитайте код и посмотрите результат, вы поймете, что происходит, когда вы что-то импортируете:

second.py

answer = 0 # you've to declare "answer" as as global variable
           # this is one mistake you've done in your code

def function(one, two):
    global answer
    answer = one + two

def print_answer_in_second():
    print("in second: {}".format(answer))

first.py :

from second import *

print("in first: {}".format(answer))
print_answer_in_second()

function(10, 30) # calling function() to change answer value in second.py

print("in first: {}".format(answer))
print_answer_in_second()

answer = 100 + 800; # changing answer value in first.py

print("in first: {}".format(answer))
print_answer_in_second()

output :

in first: 0
in second: 0
in first: 0
in second: 40
in first: 900
in second: 40

Надеюсь, вы уловили идею импорта.

Итак, как мы можем красиво решить эту проблему? Глобальные переменные являются неотъемлемой частью языка, мир программирования не может работать без globals. Но globals тоже создают проблемы. Сложно поддерживать globals. Итак, что было бы лучше всего с globals?

Ну, если вы разрабатываете приложение или какой-либо проект, лучше всего поместить globals вашего приложения или проекта в один файл , так что мы можем легко найти их и изменить их значения. Назовем наш global file glob.py. Вот код для glob.py:

glob.py:

# declaring global answer
answer = 0

Теперь давайте объявим new_second.py:

new_second.py :

import glob

def function(a, b):
    glob.answer = a + b

def print_answer_in_second():
    print("In second: {}".format(glob.answer))

new_first.py :

import glob

from new_second import function, print_answer_in_second
# note: "import ... from *" is a very bad practice
#       so, avoid use that style of import

function(10, 30)

print("In first: {}".format(glob.answer))
print_answer_in_second()

вывод :

In first: 40
In second: 40

Надеюсь, вы получили представление о том, как правильно использовать globals, не затрагивая слишком сильно другие части вашего кода.

0 голосов
/ 05 августа 2020

Я считаю, что на этот вопрос ответят по-другому, вы можете сослаться на этот вопрос . Вы определили global answer внутри функции (не вне функции и без присвоения ей какого-либо значения), поэтому в import время эта переменная, даже с ее глобальным характером, еще не объявлена. без особых подробностей о том, как реорганизовать ваше решение, вам просто нужно, чтобы first.py было написано таким образом:

import second
second.function(10, 30)
print(second.answer)

Таким образом, вы не изменили second.py, а также импортировали глобальную переменную как вы хотели.

0 голосов
/ 05 августа 2020

Нет определения глобальной переменной. Заменить second.py:

answer = None

def function(one, two):
    global answer
    answer = one + two
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...