这似乎是一件相当奇怪的事情,但我很好奇是否有可能隐式地将一个变量传递给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
,two
和three
不属于同一类,甚至不属于同一模块。
答案 0 :(得分:2)
你不想这样做。
如果您确实想要折磨自己,那么您可以创建一个单独的线程并在该线程中运行对one()
的调用。然后只需使用threading.local
作为共享状态。
你真的不想这样做。
以下是如何使用线程本地存储:
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!
这可以帮助您避免显式传递变量。
这是一个可怕的黑客。恕我直言,你真的不需要这样做。