2011-12-10 21 views
3

python3.2のグローバルスコープから別の関数の中にネストされた関数を呼び出すことはできますか?別の関数で定義された関数を呼び出す

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

func1()の外側からfunc2()を呼び出す方法はありますか?

+1

'func1()'が最初に呼び出された場合にのみ 'func2()'オブジェクトを生成しています。これらの厳密に束縛された 'def'ステートメントを切り離すために、私は常に各関数を個別に定義し、func1()を' func2() 'のラッパーとして呼び出すことを推奨します。 – Droogans

+2

@Sam動機は何ですか? – eyquem

+0

eyquemの答えが働きます。エレガントではないかもしれませんが、あなたがやっていることが分かっていれば、それを使うことができます。ダンダー属性/メソッドなどを使用するよりもはるかに優れています。 – sureshvv

答えて

11

あなたが機能返却しない限り、:

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

innerfunc = func1() 
innerfunc() 

あるいは

func1()() 
8

をあなたはが@larsmans'ソリューションを使用したいが、理論的にはローカルでのコードオブジェクトに自分でカットすることができますfunc1にアクセスし、func2というコードオブジェクトをスライスして実行します。

#!/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' 

しかし、これもまた、は何もありません。

注:Pythonの2バージョンについて(__future__からprint_functionおよびインポート)func_code__code__を置き換えます。

さらにいくつかの読書:

+3

+1は、狂気と大胆さを保ちます。フードの中で何が起こるかを理解することは、維持しなければならないコードには適していません(例えば、関数がバイトコードから切り離され、バイトコードが別々に実行されるなど)。 – delnan

+1

@delnan _「ボンネットの下で何が起こるかを理解することは素晴らしいことです」_はい! – eyquem

-1
def func1(): 
    def func2(): 
     global fudu 
     fudu = func2 
     print("Hello") 
    func2() 


func1() 

fudu() 

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

結果

Hello 
Hello 
True 
False 
また

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


func1() 

print 'func2' in dir() 
func2() 

結果

Hello 
True 
Hello 

関心は何ですか?

編集

なぜ私の答えは下降しましたか?

私の答えは大きな関心を持っているとは思わないが、実際には質問の動機は何か疑問であり、尋ねられた問題の解決に関心はない。

+1

私はあなたの答えがdownvotedされた理由は、ほとんどの説明とコードをたくさん入れ、あなたのコードはハックの何かであり、[良い解決策]があるためだと思う(http://stackoverflow.com/ a/8457693/89391)に記載されている。 –

+0

@Kazarkありがとうございます。私は説明の欠如によって与えられたこの印象を知らなかった。それどころか、わかりやすいコードに関して、読者が明白なコメントをしないようにすることは軽いと思った。 - 私のコードのための過剰な単語として私に "ハック"が現れる - 私は他のものよりも良い答えを出そうとしなかった、私はOPに追加のアイデアと理解に与えるかもしれない他の方法を示した。 – eyquem

+0

さて、ちょうどそれをハックと呼んで申し訳ありません。私は説明しなければならない。あなたのコードは定義で内部関数を呼び出しますが、これは仕様では呼び出されていません。また、 'global'キーワードを使用すると、何人かの人々がそれに惑わされる可能性があります。 –

0

これは、eyquemの解決策に基づいています。

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

これで、func2を直接呼び出すことができます。

func1()を呼び出す前にfunc1()を呼び出す必要があります。それ以外の場合は、まだ定義されていません。

関連する問題