python3.2のグローバルスコープから別の関数の中にネストされた関数を呼び出すことはできますか?別の関数で定義された関数を呼び出す
def func1():
def func2():
print("Hello")
return
return
func1()の外側からfunc2()を呼び出す方法はありますか?
python3.2のグローバルスコープから別の関数の中にネストされた関数を呼び出すことはできますか?別の関数で定義された関数を呼び出す
def func1():
def func2():
print("Hello")
return
return
func1()の外側からfunc2()を呼び出す方法はありますか?
あなたが機能返却しない限り、:
def func1():
def func2():
print("Hello")
return func2
innerfunc = func1()
innerfunc()
あるいは
func1()()
をあなたはが@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__
を置き換えます。
さらにいくつかの読書:
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
関心は何ですか?
。
私の答えは大きな関心を持っているとは思わないが、実際には質問の動機は何か疑問であり、尋ねられた問題の解決に関心はない。
私はあなたの答えがdownvotedされた理由は、ほとんどの説明とコードをたくさん入れ、あなたのコードはハックの何かであり、[良い解決策]があるためだと思う(http://stackoverflow.com/ a/8457693/89391)に記載されている。 –
@Kazarkありがとうございます。私は説明の欠如によって与えられたこの印象を知らなかった。それどころか、わかりやすいコードに関して、読者が明白なコメントをしないようにすることは軽いと思った。 - 私のコードのための過剰な単語として私に "ハック"が現れる - 私は他のものよりも良い答えを出そうとしなかった、私はOPに追加のアイデアと理解に与えるかもしれない他の方法を示した。 – eyquem
さて、ちょうどそれをハックと呼んで申し訳ありません。私は説明しなければならない。あなたのコードは定義で内部関数を呼び出しますが、これは仕様では呼び出されていません。また、 'global'キーワードを使用すると、何人かの人々がそれに惑わされる可能性があります。 –
これは、eyquemの解決策に基づいています。
def func1():
global func2 # put it in global scope
def func2():
print("Hello")
これで、func2を直接呼び出すことができます。
func1()を呼び出す前にfunc1()を呼び出す必要があります。それ以外の場合は、まだ定義されていません。
'func1()'が最初に呼び出された場合にのみ 'func2()'オブジェクトを生成しています。これらの厳密に束縛された 'def'ステートメントを切り離すために、私は常に各関数を個別に定義し、func1()を' func2() 'のラッパーとして呼び出すことを推奨します。 – Droogans
@Sam動機は何ですか? – eyquem
eyquemの答えが働きます。エレガントではないかもしれませんが、あなたがやっていることが分かっていれば、それを使うことができます。ダンダー属性/メソッドなどを使用するよりもはるかに優れています。 – sureshvv