Сделать определение функции в порядке файлов Python независимым - PullRequest
41 голосов
/ 17 апреля 2009

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

В 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()

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

Ответы [ 6 ]

60 голосов
/ 17 апреля 2009

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

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

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

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


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

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

Поэтому поместите все операторы, которые работают last .

25 голосов
/ 10 августа 2012

Еще лучше проиллюстрировать вашу точку зрения:

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 голосов
/ 17 апреля 2009

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

Шаги, которые Python предпримет при выполнении вашего кода, следующие:

  1. Определить функцию do_something.
  2. Определить функцию helper_function.
  3. Определить функцию main.
  4. (учитывая мое предположение выше) Позвоните на главную.
  5. Из основного, позвоните do_something.
  6. С do_something, вызовите helper_function.

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

2 голосов
/ 29 сентября 2015
def funB(d,c):
   return funA(d,c)

print funB(2,3)

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

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

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

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

 print funB(2,3)

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

2 голосов
/ 17 апреля 2009

Я никогда не сталкивался со случаем, когда необходимо "определение функции вперед". Разве вы не можете просто переместить 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 (?)

1 голос
/ 14 октября 2018

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

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

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

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

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