Python中每个激活的“全局”变量?

时间:2013-02-22 20:41:04

标签: python

这似乎是一件相当奇怪的事情,但我很好奇是否有可能隐式地将一个变量传递给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 个答案:

答案 0 :(得分:2)

  1. 你不想这样做。

  2. 如果您确实想要折磨自己,那么您可以创建一个单独的线程并在该线程中运行对one()的调用。然后只需使用threading.local作为共享状态。

  3. 你真的不想这样做。

  4. 以下是如何使用线程本地存储:

    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)
    

答案 1 :(得分:0)

如果必须,可以为函数对象本身赋值。理想情况下,如果未正确设置'something',则three()和two()都会执行检查,这会产生比AttributeError更好的异常。

def three():
    print(three.something)

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

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

答案 2 :(得分:0)

你可以利用词法闭包 - 在one()的定义中定义two()和three()。​​

>>> def one(something):
...     def two():
...         three()
...     def three():
...         print something
...     two()
...
>>> one(1)
1

答案 3 :(得分:0)

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

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


>>> foo()
Hello world!

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