Как вызвать процедуру внутри другой процедуры - PullRequest
0 голосов
/ 28 декабря 2018

Я работаю над созданием большого файла .py, который можно импортировать и использовать для решения математических формул.Я хотел бы сохранить формулы в процедуре, которая называется input1_input2_input3 (): например, формальное расстояние = скорость * время называется dis_spe_tim ().

Код на данный момент:

def dis_spe_tim():
    def distance(speed, time):
        result = speed*time
        unit = input("What unit are you measuring the distance in?")
        print(resule,unit)

    def speed():
        print("speed")

и в идеале я бы хотел, чтобы пользователь использовал это следующим образом:

import equations #name of the .py file
from equations import *
dis_spe_tim.distance(1,2)

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

1 Ответ

0 голосов
/ 28 декабря 2018

Краткий ответ: вы не можете.Вложенные функции являются локальными по отношению к функции, в которой они определены, и существуют только во время выполнения внешней функции (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, веб-интерфейс и т. Д.), А также, достаточно просто, чтобы убедиться, что код вашего домена легко тестируется изолированно (модульное тестирование ...).

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