Подтвердить что ты не робот

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

Я использую CGI Python. Я не могу вызвать функцию до ее определения.

В Oracle PL/SQL был этот трюк "прямой декларации": называть все функции сверху, поэтому порядок определения не имеет значения.

Есть ли такой трюк и в Python?

Пример:

def do_something(ds_parameter):
    helper_function(ds_parameter)
    ....

def helper_function(hf_parameter):
    ....

def main():
    do_something(my_value)

main()

Дэвид прав, мой пример неверен. Как насчет:

<start of cgi-script>

def do_something(ds_parameter):
    helper_function(ds_parameter) 
    .... 

def print_something(): 
    do_something(my_value) 

print_something() 

def helper_function(hf_parameter): 
    .... 

def main()
    ....

main()

Могу ли я "переслать объявить" функции в верхней части script?

4b9b3361

Ответ 1

Все функции должны быть определены до их использования.

Однако функции могут быть определены в любом порядке, если все они определены до того, как любой исполняемый код использует функцию.

Вам не нужно "форвардное объявление", потому что все объявления полностью независимы друг от друга. Пока все объявления появляются перед всем исполняемым кодом.

У вас проблема? Если да, отправьте код, который не работает.


В вашем примере print_something() неуместен.

Правило: Все функции должны быть определены до того, как любой код, выполняющий реальную работу

Поэтому поместите все инструкции, которые работают в последний раз.

Ответ 2

Еще лучшая иллюстрация вашей точки:

def main():
    print_something() 
    ....

def do_something(ds_parameter):
    helper_function(ds_parameter) 
    .... 

def print_something(): 
    do_something(my_value) 


def helper_function(hf_parameter): 
    .... 


main()

Другими словами, вы можете сохранить свое определение main() вверху, для удобства редактирования - избегать частой прокрутки, если большую часть времени тратится на редактирование main.

Ответ 3

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

Действия, выполняемые Python при выполнении кода, следующие.

  • Определите функцию do_something.
  • Определите функцию helper_function.
  • Определите основную функцию.
  • (Учитывая мое предположение выше) Назовите main.
  • Из основного вызова do_something.
  • От do_something вызовите helper_function.

Единственный раз, когда Python заботится о том, что helper_function существует, когда он переходит к шагу шесть. Вы должны убедиться, что Python делает все это до шести шагов, прежде чем поднимать ошибку, когда пытается найти helper_function, чтобы он мог ее вызвать.

Ответ 4

Я никогда не сталкивался с ситуацией, когда требуется "форвард-функция-определение". Не можете ли вы просто переместить print_something() внутрь своей основной функции..?

def do_something(ds_parameter):
    helper_function(ds_parameter) 
    .... 

def print_something(): 
    do_something(my_value) 


def helper_function(hf_parameter): 
    .... 

def main()
    print_something() 
    ....

main()

Python не заботится о том, что helper_function() определяется после использования в строке 3 (в функции do_something)

Я рекомендую использовать что-то вроде WinPDB и переходить через ваш код. Это хорошо показывает, как работает парсер/исполнитель Python (?)

Ответ 5

def funB(d,c):
   return funA(d,c)

print funB(2,3)

def funA(x,y):
    return x+y

Приведенный выше код вернет Error. Но, следующий код в порядке...

 def funB(d,c):
     return funA(d,c)

 def funA(x,y):
     return x+y

 print funB(2,3)

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

Ответ 6

Для всех людей, которые несмотря на плохую практику хотят обходного пути...
У меня была похожая проблема, и я решил ее так:

 import Configurations as this
 '''Configurations.py'''
 if __name__ == '__main__':
   this.conf01()

 '''Test conf'''
 def conf01():
   print ("working")

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

Ответ 7

Использовать многопроцессорный модуль:

from multiprocessing import Process

p1 = Process(target=function_name, args=(arg1, arg2,))
p1.start()