Импорт функций в Python - PullRequest
       19

Импорт функций в Python

1 голос
/ 28 апреля 2019

Как я могу импортировать функции, использующие переменную, определенную в текущем файле?

main.py

from functions import a

x = 1

print(a())

functions.py

def a():
    return x

Сообщение об ошибке

Traceback (most recent call last):
  File "c:\Users\Test\.vscode\extensions\ms-python.python-2019.4.11987\pythonFiles\ptvsd_launcher.py", line 43, in <module>
    main(ptvsdArgs)
  File "c:\Users\Test\.vscode\extensions\ms-python.python-2019.4.11987\pythonFiles\lib\python\ptvsd\__main__.py", line 410, in main
    run()
  File "c:\Users\Test\.vscode\extensions\ms-python.python-2019.4.11987\pythonFiles\lib\python\ptvsd\__main__.py", line 291, in run_file
    runpy.run_path(target, run_name='__main__')
  File "C:\Users\Test\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "C:\Users\Test\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "C:\Users\Test\AppData\Local\Programs\Python\Python37\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "c:\Users\Test\Google Drive\Dev\Test\main.py", line 5, in <module>
    print(a())
  File "c:\Users\Test\Google Drive\Dev\Test\functions.py", line 2, in a
    return x
NameError: name 'x' is not defined

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

Как уже отмечалось в другом ответе, это не будет работать из-за того, как Python определяет переменные.

Поэтому вместо этого я предлагаю переместить все эти переменные в отдельный файлНапример, constants.py:

main.py

from functions import a

print(a())

constants.py

X = 1

functions.py

from constants import X

def a():
    return X

Тогда,работает import main печатает 1.

0 голосов
/ 28 апреля 2019

Не существует глобальных переменных всего процесса, только глобальные переменные уровня модуля.a использует functions.x, а не x, в какой бы глобальной области он ни был , называемый from.

import functions
from functions import a, b, c

functions.x = 1
functions.y = 2
functions.z = 3

print(a())
print(b())
print(c())

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

...