1

これはかなり奇妙なことのように思えるかもしれませんが、引数として渡さずにPythonの呼び出しチェーンに変数を暗黙的に渡すことができるかどうか興味がありました。ここでよりよく説明するために、例を示します。

これが「通常の」方法です。

def three(something):
    print(something)

def two(something):
    # ...
    three(something)

def one(something):
    # ...
    two(something)

そして、これが私がしたいことです:

def three():
    # something is defined implicitly
    print(something)

def two():
    # ...
    three()

def one(something):
    # somehow define something inside a context
    # for this activation 
    two()

この目的のために、、、oneおよびtwothree同じクラスまたは同じモジュールに含まれていません。

4

4 に答える 4

2
  1. あなたはこれをしたくありません。

  2. 自分を苦しめたいと本当に確信している場合は、別のスレッドを作成してone()、そのスレッドで への呼び出しを実行できます。次にthreading.local、共有状態に使用します。

  3. あなたは本当にこれをしたくありません。

スレッド ローカル ストレージの使用方法は次のとおりです。

import threading
state = threading.local()

def three():
    # something is defined implicitly
    print(state.something)

def two():
    # ...
    three()

def one(something):
    # somehow define something inside a context
    # for this activation
    def inner():
        state.something = something
        two()
    t = threading.Thread(target=inner)
    t.start()
    t.join()

if __name__=='__main__':
    one(42)
    one(24)
于 2013-02-22T21:04:09.827 に答える
0

__builtins__「グローバル変数」を保持するために使用できます。

>>> __builtins__.something = "Hello world!"
>>> def foo():
    print something


>>> foo()
Hello world!

これにより、変数を明示的に渡すことを回避できます。
これはひどいハックです。私見、あなたは本当にそれをする必要はありません。

于 2013-02-22T21:28:41.220 に答える
0

必要に応じて、関数オブジェクト自体に値を割り当てることができます。理想的には、three() と two() の両方が、「something」が正しく設定されていない場合に AttributeError よりも優れた例外を発生させるチェックを実行します。

def three():
    print(three.something)

def two():
    three.something = two.something
    three()

def one(something):
    two.something = something
    two()
于 2013-02-22T20:54:23.277 に答える
0

レキシカル クロージャを利用できます。one() の定義内で two() と three() を定義します。

>>> def one(something):
...     def two():
...         three()
...     def three():
...         print something
...     two()
...
>>> one(1)
1
于 2013-02-22T21:08:54.760 に答える