2013-11-11 3 views
1

Вот мой код:Вызов функции, которая была определена в функции

def function1(): 
    def function2(): 
     print 'function2 has been called' 
    def function3(): 
     pass 

function1 позволяет мне называть function2 и FUNCTION3 в последовательности. Но как я могу вызвать функцию2 или функцию3 извне функции1?

Я пытался без успеха:

function1.function2() 

и:

import function1 
function1.function2() 
+0

Это невозможно. Если необходимо, переместите функцию вне 'function1'. –

ответ

3

Вы не можете вызвать вложенные функции. Они локальны только для function1().

Либо переместите их определение из из function1(), чтобы сделать их глобальные имена, называть их внутри function1(), или вернуть их, чтобы кто-нибудь вызова function1() можно получить ссылки на объекты функции.

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

Как Глобалы:

def function2(): 
    print 'function2 has been called' 

def function3(): 
    pass 

def function1(): 
    # call the other functions 
    function2() 
    function3() 
+0

Таким образом, нет возможности установить их в качестве глобальных функций? – MoTSCHIGGE

+0

@MoTSCHIGGE: Конечно, есть, сделать их глобальными функциями. Почему у вас есть *, чтобы вложить их? –

+0

@ Martijn Pieters: Потому что это позволяет мне сразу вызвать внутренние функции. Каков синтаксис для создания глобальных функций? глобальная функция2 не работает – MoTSCHIGGE

0

Вам нужно создать модуль может быть класс

class MySuperClass: 
    def function2(self): 
     print 'function2 has been called' 
    def function3(self, someArg): 
     print 'function3 has been called with argument: '+ someArg 

Python docs

+0

Хорошо, но если я это сделаю, я не могу сразу вызвать функцию2 и функцию3. Я должен назвать их отдельно. – MoTSCHIGGE

1

Если вам нужно function2 и FUNCTION3 быть внутренние функции (потому что они используют локальные переменные к функции1, но не переданы в качестве аргументов для f2 или f3 или по какой-либо другой причине), напишите функцию, возвращающую функцию.

Функция:

def function1(a,b): 
    c = a+b 
    d = a*b*c 
    def function2(d): 
     print c+d 
    def function3(): 
     pass 
    function2(d) 

эквивалентно:

def funcwrap(c): 
    def inner(d): 
     return c+d 
    return inner 

def function1(a,b): 
    c = a+b 
    d = a*b*c 
    function2 = funcwrap(c) 
    print function2(d) 

Это позволяет создавать и использовать Function2 как внутри, так и снаружи function1.

Смежные вопросы