Czy mogę zadzwonić do funkcji zagnieżdżonej w innej funkcji z globalnego zakresu w Pythonie.2?

def func1():
    def func2():
        print("Hello")
        return
    return

Czy istnieje sposób, aby zadzwonić do FUNC () z zewnątrz FUCC1 ()?

10
charmoniumQ 10 grudzień 2011, 19:41

4 odpowiedzi

Najlepsza odpowiedź

Nie, chyba że zwrócisz funkcję:

def func1():
    def func2():
        print("Hello")
    return func2

innerfunc = func1()
innerfunc()

Lub nawet

func1()()
21
Fred Foo 10 grudzień 2011, 16:07

Ty Chcesz , aby użyć Rozwiązanie @larsmans ', ale teoretycznie można wyciąć do obiektu kodu lokalnego dostępnego func1 i pokroić obiekt kodu func2 i wykonaj, że:

#!/usr/bin/env python

def func1():
    def func2():
        print("Hello")

# => co_consts is a tuple containing the literals used by the bytecode
print(func1.__code__.co_consts)
# => (None, <code object func2 at 0x100430c60, file "/tmp/8457669.py", line 4>)

exec(func1.__code__.co_consts[1])
# => prints 'Hello'

Ale znowu jest to Nic do kodu produkcyjnego .

Uwaga: W przypadku wersji Python 2 zastąp __code__ za pomocą func_code (i zaimportuj print_function z __future__).

Niektóre dalsze czytanie:

10
Community 23 maj 2017, 12:03

Jest to oparte na rozwiązaniu Eyquena.

def func1():
    global func2  # put it in global scope
    def func2():
        print("Hello")

Teraz możesz natychmiast wywołać FUNC2.

Ale FUNC1 () musiałby zostać wywołane, zanim będziesz mógł zadzwonić do FUNC2 () w przeciwnym razie nie zostanie jeszcze zdefiniowany.

0
sureshvv 26 sierpień 2017, 11:50
def func1():
    def func2():
        global fudu
        fudu = func2
        print("Hello")
    func2()


func1()

fudu()

print 'fudu' in dir()
print 'func2' in dir()

Wynik

Hello
Hello
True
False

Również:

def func1():
    global func2
    def func2():
        print("Hello")
    func2()


func1()

print 'func2' in dir()
func2()

Wynik

Hello
True
Hello

Jakie jest zainteresowanie?

.

Edytować

Dlaczego moja odpowiedź była obniżona?

Nie sądzę, żeby moja odpowiedź ma duże zainteresowanie, ale faktem jest, że zastanawiam się również, jaka jest motywacja pytania i nie widzę żadnych zainteresowań w rozwiązywaniu zadanego problemu.

0
deceze 29 maj 2020, 11:37