Краткий ответ: вы не можете.Вложенные функции являются локальными по отношению к функции, в которой они определены, и существуют только во время выполнения внешней функции (def
- это исполняемый оператор, который во время выполнения создает объект функции и связывает его с его именем в окружающем пространстве имен).
Каноническое решение Python состоит в том, чтобы использовать модули в качестве пространств имен (ну, модули Python являются, главным образом, пространствами имен), то есть иметь отдельный модуль для каждой «формулы» и определять функции на верхнем уровне модуля:
# dis_spe_tim.py
def distance(speed, time):
# code here
def speed():
# code here
Затем поместите все эти модули в пакет equations
(в основном: в папку, содержащую модули и файл __init__.py
).Затем вы можете сделать:
from equations import dis_spe_tim
dis_spe_tim.distance(1,2)
Вы можете проверить документацию для получения дополнительной информации о модулях и пакетах здесь: https://docs.python.org/3/tutorial/modules.html#packages
Также обратите внимание, что
1 / "star import"(также называемый" подстановочным импортом "), т. е. from somemodule import *
, крайне не рекомендуется , так как они обычно затрудняют чтение и обслуживание кода и могут вызывать неожиданные (а иногда и субтитры, достаточные для того, чтобы их было трудно обнаружить)) поломки.
2 / вы не должны смешивать код «домена» (код, который выполняет эффективные вычисления) с кодом UI (код, который общается с пользователем), поэтому любой вызов input()
, print()
и т. д. должен быть за пределами «доменного» кода.Это ключ к тому, чтобы сделать код вашего домена пригодным для использования с различными пользовательскими интерфейсами (командной строкой, на основе текста (проклятие и т. Д.), GUI, веб-интерфейс и т. Д.), А также, достаточно просто, чтобы убедиться, что код вашего домена легко тестируется изолированно (модульное тестирование ...).