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()

为此onetwothree不在同一类甚至同一模块中。

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

如果必须,您可以为函数对象本身赋值。理想情况下,如果 'something' 设置不正确,three() 和 two() 都会执行会引发比 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 回答
0

您可以使用__builtins__来保存“全局变量”。

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


>>> foo()
Hello world!

这可以帮助您避免显式传递变量。
这是一个可怕的黑客攻击。恕我直言,你真的不需要这样做。

于 2013-02-22T21:28:41.220 回答