Python 仅在上下文中声明全局变量(使用)

Python 仅在上下文中声明全局变量(使用),python,Python,我不知道这是否可能,但我需要设置一个全局对象,但只能在上下文中设置(使用) 例如,我有两部分代码。第一个是读取和写入一些文件的worker对象。 但是工作人员实际上不知道这些文件的实际路径,因此我创建了一个包装器,用于将打开的文件重定向到良好的文件路径 问题是我为工人的每个任务(带有自己的文件)创建了一个包装器。 我不能在工作期间传递每个函数的包装器。 允许工作函数通过包装器打开的最佳方法是将其设置为全局,但我使用的是线程,实际上无法将其设置为全局(可以同时设置具有多个包装器的多个任务) 我想做

我不知道这是否可能,但我需要设置一个全局对象,但只能在上下文中设置(使用)

例如,我有两部分代码。第一个是读取和写入一些文件的worker对象。 但是工作人员实际上不知道这些文件的实际路径,因此我创建了一个包装器,用于将打开的文件重定向到良好的文件路径

问题是我为工人的每个任务(带有自己的文件)创建了一个包装器。 我不能在工作期间传递每个函数的包装器。 允许工作函数通过包装器打开的最佳方法是将其设置为全局,但我使用的是线程,实际上无法将其设置为全局(可以同时设置具有多个包装器的多个任务)

我想做的是这样的事情:

with init_current_wrapper(task) as wrapper: #  do_some_magic_for_set_it_global(wrapper)

    do_some_jobs_for_this(task) # all process inside can access THIS wrapper
在“为这个()做一些工作”的过程中,我可以做

wrapper = get_current_wrapper()
wrapper.open("fakefilename")
#blablabla
如果没有线程,一个简单的OSWrapper.get_current()就可以做到这一点,但是有了线程,我不知道在当前上下文中什么是“好”的包装器

有什么想法吗


谢谢

我认为解决您问题的干净方法是将
包装器
对象传递给用户


如果这是不切实际的,您可以使用。但是,我认为第一种方法(传递
包装器
)远远优于其他方法。

与使用包装器对象向每个线程传递文件名不同,您可能希望使用一个工作线程池,从对象获取文件名,如下例所示:

import threading
import time
from Queue import Queue

NUM_FILES = 10
NUM_WORKERS = 3

queue = Queue()

def worker():
    print 'Thread started'
    while True:
        filename = queue.get()
        print 'Opening file:', filename
        # Do something with the file                                                                                                     
        time.sleep(1)
        print 'Closing file:', filename
        queue.task_done()


for i in range(NUM_WORKERS):
    thread = threading.Thread(target=worker)
    thread.daemon = True
    thread.start()

filenames = ['filename-{0}'.format(i)
             for i in range(NUM_FILES)]
for filename in filenames:
    queue.put(filename)

queue.join()

谢谢,我需要的似乎是本地的。我讨厌使用global:(这不是pythonic,但不可能传递包装器,我对包装器的定义和使用它的需要之间的不同函数调用远远不止12-15次。谢谢你的帮助,但我的应用程序远比这复杂:)而且它的细节已经写好了。